簡體   English   中英

從表到表的批量插入

[英]Bulk Insert from table to table

我正在實現A / B / View場景,這意味着View指向表A ,而表B更新,然后發生切換,並且在加載表A時視圖指向表B.

每天都會進行切換。 有數百萬行要更新,數千名用戶正在查看該視圖。 我在SQL Server 2012上。

我的問題是:

  • 如何以最快的方式將數據從另一個表插入表中? (在存儲過程中)
  • 有沒有辦法使用BULK INSERT? 或者,使用常規插入/選擇最快的方式去?

您可以從SrcTable選擇ColA,ColB到DestTable_New。 加載DestTable_New后,重新創建索引和約束。

然后將DestTable重命名為DestTable_Old,並將DestTable_New重命名為DestTable。 重命名非常快。 如果出現問題,您還可以通過(DestTable_Old)備份上一個表。

我曾經做過這種情況,我們必須讓系統全天候運行並且每天需要加載數千萬行。

你可以做到

SELECT fieldnames
INTO DestinationTable
FROM SourceTable

正如一對答案建議的那樣,應該盡可能快(取決於你需要重新創建多少索引等)。

但我建議使用同義詞來將指針從一個表更改為另一個表。 它們非常透明,在我看來,比更新視圖或重命名表更清晰。

我傾向於使用SSIS。

使表A成為OLEDB源,表B成為OLEDB目的地。 您將繞過事務日志,以減少數據庫的負載。 使用T-SQL執行此操作的唯一方法(我能想到)是更改整個數據庫的恢復模型,這遠非理想,因為這意味着不存儲任何事務,而不僅僅是傳輸事務。

設置SSIS傳輸

創建一個新項目並將數據流任務拖到設計圖面

工具箱菜單

雙擊數據流任務,該任務將引導您進入“數據流”選項卡。 然后從“數據流源”菜單中拖放OLE DB源,並從“數據流目標”菜單中拖放OLE DB目標

數據流源數據流目的地

雙擊OLE DB源,設置與服務器的連接,選擇要加載的表,然后單擊“確定”。 將綠色箭頭從OLE DB源拖動到目標,然后雙擊目標。 設置連接管理器,目標表名稱和列映射,你應該很高興。

MSDN上的OLE DB源文檔

MSDN上的OLE DB目標文檔

INSERT... SELECT...功能與BULK INSERT非常相似。 您可以使用SSIS,就像@GarethD所說的那樣,但如果您只是將行從table1復制到table2,那可能會過於復雜。

如果要復制大量數據,請密切關注事務日志 - 在進行大量插入時,它會非常快速地膨脹。 一種解決方法是通過循環一個插入語句來“插入”您正在插入的數據,例如,每次只處理100,000或10,000行(取決於行的寬度,即每遍的MB數)。

(只是好奇,你是否正在進行ALTER VIEW以重置視圖?我曾做過類似的事情,雖然我們必須有四個表和四個視圖來支持過去/現在/下一個/交換集。)

我知道問題已經過時了,但我正在尋找同一個問題的答案,並沒有找到任何真正有用的東西。 是的SSIS方法是可能的,但問題需要存儲過程。

令我高興的是,我發現了(幾乎)原始問題所需的解決方案; 你可以用CLR SP做到這一點。

從TableA中選擇數據到DataTable中,然后使用SqlBulkCopy類的WriteToServer(DataTable dt)方法和TableB作為DestinationTableName。

唯一的缺點是CLR過程必須使用外部訪問才能使用SqlBulkCopy,並且不能與上下文連接一起使用,因此您需要對權限和連接字符串進行一些操作。 但是嘿! 沒有什么是完美的。

你可以這樣做

    select * into A from B Where [criteria]

這將根據標准從B中選擇數據並將其插入到A中,前提是列相同或者您可以指定列名而不是*。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM