2016-11-09 37 views
0

我有一個複雜的查詢,並且正在從700,000多行中進行選擇。查詢返回varchardate。如果我select結果運行在2分鐘之內。如果我把它們變成一張新表,這需要大約相同的時間。如果我做了update這需要1個多小時。T-SQL更新顯着慢於選擇或插入

更新查詢類似於以下內容:

UPDATE 
    BD 
SET 
    datetext = V1.datetextvalue, 
    datedate = V1.datevalue 
FROM 
    datatable AS BD 
    LEFT JOIN 
    aview1 AS V1 
    ON BD.indexa = V1.indexa 

數據表是:

primaryKey int 
indexa int 
datetext varchar(max) NULL 
datedate datetime NULL 

和,除了primaryKey沒有索引。 inedxa是一個獨特的價值。

我能做些什麼來加快速度?

UPDATE

以上是實際的查詢的一個粗略的簡化和支撐視圖。執行計劃非常複雜,幾乎不可讀。我的關鍵問題是select非常快,它的更新速度很慢。

我已經使用查詢來創建一個臨時表 - 這很快。但是,如果我從臨時表更新主表,這同樣慢。

+2

您可以添加執行計劃和'aview1'的定義嗎? –

+0

@ destination-data對不起,意在添加到這個問題。以上是對實際查詢和支持視圖的簡化。執行計劃非常複雜,幾乎無法閱讀。對我來說關鍵的問題是'select'非常快,它的更新很慢 –

+1

懷疑可能是這種情況。沒有表格定義,很難解決問題的根本原因。但@Vicky_Thinking提出的答案可能會幫助您解決這個問題。 –

回答

1

您可以嘗試的是將事務日誌條目保持爲最小,以便您的更新速度更快。嘗試如下批量更新。

UPDATE TOP(1000) BD 
SET 
    datetext = V1.datetextvalue, 
    datedate = V1.datevalue 
FROM datatable AS BD 
    LEFT JOIN 
    aview1 AS V1 
    ON BD.indexa = V1.indexa 
WHILE @@rowcount > 0 
BEGIN 
    UPDATE TOP(1000) BD 
SET 
    datetext = V1.datetextvalue, 
    datedate = V1.datevalue 
FROM datatable AS BD 
    LEFT JOIN 
    aview1 AS V1 
    ON BD.indexa = V1.indexa 
END; 
GO 
+0

如果你不介意我問,這是如何工作的?爲什麼它會停止在WHILE中更新? – Cato

+0

謝謝,這使整個過程更易於管理 –