我正在處理大型數據庫,並需要關於如何優化我的選擇/更新的建議。這裏有一個例如:在單個語句與批處理中執行SQL更新
create table Book (
BookID int,
Description nvarchar(max)
)
-- 8 million rows
create table #BookUpdates (
BookID int,
Description nvarchar(max)
)
-- 2 million rows
讓我們假設有800萬名的書籍和我有更新流派爲他們的200萬美元。
問題:運行這些更新的時間很長。它偶爾會導致同時試圖從數據庫運行語句的用戶阻塞。我想出了一個解決方案,但想知道是否有更好的解決方案。我要準備一次性隨機更新這樣很多(無論何種原因)
-- normal update
update b set b.Description = bu.Description
from Book b
join #BookUpdates bu
on bu.BookID = b.BookID
-- batch update
while (@BookID < @MaxBookID)
begin
update b set b.Description = bu.Description
from Book b
join #BookUpdates bu
on bu.BookID = b.BookID
where bu.BookID >= @BookID
and bu.BookID < @BookID + 5000
set @BookID = @BookID + 5000
end
第二次更新工作速度快了很多。我喜歡這個解決方案,因爲我可以將自己的狀態更新打印出來,並且不會給客戶帶來性能問題。
問題:我錯過了重要的東西嗎?臨時表上的索引?
我更新了EXAMPLE表,所以我沒有得到更多的規範化註釋。每本書只有1個說明:)
我們在談論哪些RDBMS? SQL Server,因爲它看起來,但只是可以肯定的。您現在可以顯示更新的查詢計劃嗎? –
SQL Server。我沒有查詢計劃,所以當我這樣做時,我可能會重新發布問題。我們的數據庫非常慢,所以需要一段時間才能找到BookID。索引會有幫助嗎? – user1002479
兩個連接ID上的索引幾乎總是有助於加快速度,但很難說沒有看到實際的計劃。 –