Sql-Server

用於暫存數據的 DROP、DELETE 和 TRUNCATE

  • October 13, 2017

我需要將數據 (>> 1 GB) 導入 MS-SQL-Server。出於多種原因,我需要將此數據導入臨時表(而不是直接導入目標)。從登台開始,數據被載入到目標表中。暫存表中的數據永遠不會再次使用。我有幾種方法:

  1. 將數據載入到 staging stable 中,將此數據標記為新數據,僅將標記的數據載入到目標中,取消標記數據。
  2. 刪除 staging 中的所有數據,將數據載入到 staging 表中,將所有數據載入到目標中。
  3. 截斷登台表,載入到登台,載入到目標
  4. 刪除臨時表,創建臨時表,載入到臨時表,載入到目標。
  5. 刪除臨時數據庫,創建臨時表,載入到臨時表,載入到目標。

如果解決方案不受您的伺服器角色的限制:推薦的解決方案是什麼?哪個最健壯?

如果您不再需要數據,解決方案 1 很可能是無稽之談。與 1 和 2 相比,解決方案 3 的性能要好得多。但是解決方案 4 和 3 之間呢?實際上,我更喜歡解決方案 5,因為我可以在載入過程中更改暫存過程中的幾乎每個參數,但您需要刪除和創建數據庫的權限。這對於載入過程來說是相當多的。所以在大多數情況下,我使用 drop 並重新創建臨時表。但這是推薦的方式嗎?

推薦的解決方案是什麼?

  • 選項 3 如果您可以更改要插入的數據庫的恢復模型,否則創建一個暫存數據庫並將其批量或簡單恢復。
  • 根據 sql server 的版本,您甚至可以將記憶體優化表用於使用 schema_ONLY 創建的暫存。

哪個最健壯?- 測試它適合您的要求。不要刪除整個數據庫或表 - 無論如何,當您重用它時,刪除和重新創建 .. 有什麼意義。

最近我需要將 3+ GB 的 csv 文件導入 sql server。以下是我在使用 SSD 和 16 核和 256GB RAM 的物理機器(在 VM 上稍微少一點)上實現 100K 行/秒(YMMV,由於硬體和環境差異)所做的工作。

  • 使用BULK INSERT .. WITH (TABLOCK) & TF 610 & 適當的批量和大容量日誌恢復模型,並將數據插入臨時表(根本沒有索引)或使用SSIS - 使用快速載入
  • 根據用於壓縮的 sql server 版本,您可以使用列儲存索引(這可能會減慢一點……但不會顯著)。
  • 為獲得最佳性能,您可以使用 BULK INSERT 拆分文件並同時插入。
  • 如果您無法為您嘗試插入的數據庫切換到 BULK Logged 或 Simple 恢復模式,您可以擁有一個帶有臨時表的單獨數據庫。
  • 如果數據將很大,則插入不同的分區並使用分區並在載入完成時僅切換分區。從 sql server 2016 開始,您可以截斷單個分區。這樣,您可以創建一個動態腳本來使用 BULK INSERT 插入不同的分區,然後切換分區。
  • 確保預先設置數據和日誌文件的大小以使自動增長事件最少,電源計劃設置為高性能並啟用即時文件初始化。

有關其他提示,請參閱我的回答:

引用自:https://dba.stackexchange.com/questions/188391