簡體   English   中英

SQL-更新大表(9億條)記錄的查詢性能

[英]SQL - Update query performance for large table (900 million) records

我有一個擁有9億條記錄的數據庫表。 我處於一種情況,需要更新該表中的4個不同鍵,方法是將它們聯接到一個維度,然后將事實表的鍵設置為該維度的鍵。 我已經編寫了4種不同的SQL腳本(請參見下面的示例)來執行更新,但是問題是執行時間太長。 該查詢已經運行了20多個小時,我什至不確定它走了多長時間以及需要多長時間。 我有什么辦法可以改善此狀況,因此只需幾個小時即可完成。 添加索引會改善這一點嗎?

UPDATE f
SET f.ClientKey = c.ClientKey
FROM dbo.FactSales f
JOIN dbo.DimClient c
ON f.ClientId = c.ClientId
  1. 腳本外鍵。 放下
  2. 更新列上的腳本索引(不屬於條件)。 放下
  3. 禁用觸發器(如果存在)。
  4. 禁用所有可以進行鎖定的進程(= all,包括selects)。
  5. 更新密鑰。
  6. 重新創建您的外鍵,索引,啟用觸發器。
  7. 要開心。

並注釋5-僅使用所有新的源代碼從目標表中准備主鍵,並執行一條語句。 這意味着較少的連接成本,並且只有一個連接。

可以用它來不填寫交易日志

select 1 
while(@@rowcount > 0)
begin 
    UPDATE f
    SET top (100000) f.ClientKey = c.ClientKey
    FROM dbo.FactSales f
    JOIN dbo.DimClient c
    ON  f.ClientId   = c.ClientId 
    AND f.ClientKey != c.ClientKey
end

如果您需要更新4個不同的鍵,則一次完成所有操作
大部分成本是獲取鎖

禁用f.ClientKey,運行更新,然后重建它

如果您確定DimClient不會更改with (nolock)但需要確保

如果您是唯一需要更新FactSales的進程,請使用Tablock Holdlock

用正確的值創建一個新表。 然后添加索引和約束。 刪除現有表並將新表重命名為現有的一對一事務。

暫無
暫無

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

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