2017-02-12 56 views
2

我有一個擁有9億條記錄的數據庫表。我處於需要更新該表中4個不同鍵的情況,方法是將它們連接到一個維並將事實表的鍵設置爲該維的鍵。我已經編寫了4個不同的SQL腳本(請參閱下面的示例)來執行更新,但問題是執行時間太長。該查詢已運行超過20個小時,我甚至不知道它走多遠,這需要多長時間。我有什麼辦法可以改善這一點,所以只需要幾個小時就可以完成。添加索引會改善嗎?SQL - 更新大表(900萬條記錄)的查詢性能

UPDATE f 
SET f.ClientKey = c.ClientKey 
FROM dbo.FactSales f 
JOIN dbo.DimClient c 
ON f.ClientId = c.ClientId 
+1

在針對900,000,000行表執行此操作之前,您沒有對較小的子集進行測試嗎?哎喲。最壞的情況是更新列上的索引。我寧願創建一個新表,編寫一個包含所有4個連接的Select,插入/選擇,刪除和重命名。 – dnoeth

+0

如果(或更可能'何時')這是要回滾... ouch ... –

回答

0
  1. 腳本外鍵。放下它們。
  2. 更新列上的腳本索引(不屬於條件的一部分)。放下它們。
  3. 禁用觸發器(如果存在)。
  4. 禁用所有可以鎖定的進程(= all,include選擇)。
  5. 更新您的鑰匙。
  6. 重新創建您的外鍵,索引,啓用觸發器。
  7. 很高興。

5的註釋 - 從目標表中只准備所有新源代碼的主鍵,並做一個語句。這意味着聯接的成本更低,並且只有一個聯接。

0

可以使用這個不填滿事務日誌

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

+0

你要掃描數據一遍又一遍,一遍又一遍...... –

+0

@DuduMarkovitz正確。填寫交易日誌並讓所有的事情都恢復得更好? – Paparazzi

+0

我沒有得到你的意圖 –

0

使用正確的值創建新表。之後添加索引,約束。如果可能,刪除現有表並將新表重新命名爲現有表。