![](/img/trans.png)
[英]Bulk Insert DataSet with multiple related tables into SQL Server C#
[英]BULK INSERT across multiple related tables?
我需要在3個表中進行數十萬條記錄的大容量插入。 這些表的簡單分類如下:
TableA
--------
TableAID (PK)
TableBID (FK)
TableCID (FK)
Other Columns
TableB
--------
TableBID (PK)
Other Columns
TableC
--------
TableCID (PK)
Other Columns
當然,批量插入的問題在於它只能在一張桌子上使用,所以FK成為一個問題。
我一直在尋找解決此問題的方法,從我從各種來源收集到的信息來看,使用SEQUENCE列可能是最好的選擇。 我只想確保我已將我閱讀過的各種線程和帖子中的邏輯正確地拼湊在一起。 讓我知道我是否有正確的想法。
首先,將表修改為如下形式:
TableA
--------
TableAID (PK)
TableBSequence
TableCSequence
Other Columns
TableB
--------
TableBID (PK)
TableBSequence
Other Columns
TableC
--------
TableCID (PK)
TableCSequence
Other Columns
然后,從應用程序代碼中,我將使用以下邏輯對數據庫進行五個調用:
向TableC請求X序列號,其中X是要插入到TableC中的已知記錄數。 (第一個數據庫調用。)
向TableB請求Y序列號,其中Y是要插入到TableB中的已知記錄數(第二個DB調用)。
用現在已知的序列號修改A,B和C的現有對象(它們是為反映表而生成的模型)。
批量插入TableA。 (第3個數據庫調用)
然后,當然,我們總是會加入序列。
我有三個問題:
我的基本邏輯正確嗎?
在表B和C中,我是否可以從PK中刪除聚簇索引並改為放在Sequence中?
從表B和C請求序列號后,它們是否會以某種方式鎖定在請求和批量插入之間? 我只需要確保在請求和插入之間,其他一些過程不會請求並使用相同的數字。
謝謝!
編輯:
鍵入並發布后,我一直在深入閱讀SEQUENCE文檔。 我想我一開始誤解了。 SEQUENCE不是列類型。 對於表中的實際列,我只需要使用INT(或者可能是BIGINT),具體取決於我希望擁有的記錄數。 實際的SEQUENCE對象是一個完全獨立的實體,其任務是根據請求生成數值並跟蹤已經生成的數值。 因此,如果我理解正確,我將生成兩個SEQUENCE對象,一個與表B結合使用,一個與表C結合使用。
這樣就回答了我的第三個問題。
我的基本邏輯正確嗎?
是。 另一個常見的方法是將數據批量加載到臨時表中,然后在服務器端執行類似的操作。
您可以從客戶端使用sp_sequence_get_range存儲過程請求序列值的范圍。
在表B和C中,我是否要從PK中刪除聚集索引
不,正如您稍后提到的,該序列僅為您提供PK值。
抱歉,剛讀錯您的問題。 我現在看到您正在嘗試生成自己的PK,而不是允許MS SQL為您生成它們。 刮擦我的上述評論。
正如David Browne提到的那樣,您可能希望使用登台表來避免對應用程序堆造成的負擔。 使用tempdb並使用每個表的單個事務直接在表上進行修改。 然后,將登台表復制到其目標,或者在追加時使用MERGE。 如果要強制執行FK,如果選擇以相反的順序插入(C => B => A),則可以暫時刪除這些約束。 如果在插入過程中遇到性能問題,您可能還需要考慮臨時刪除索引。 最后,考慮使用SSIS而不是自定義應用程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.