2014-02-24 29 views
0

最有效的方法我會使用3代不同表的特定值之和更新表。爲此我寫了這個查詢。但是這花費了太多時間,對此目的最有效的查詢是什麼?嵌套的SQL服務器更新查詢

UPDATE dbo.dumpfile_doroud 
SET dumpfile_doroud.sms_count_on_net = (SELECT sms_count_on_net 
              FROM dbo.dumpfile139201 
              WHERE 
       dbo.dumpfile_doroud.msisdn = dbo.dumpfile139201.msisdn) 
              + (SELECT sms_count_on_net 
              FROM dbo.dumpfile139202 
              WHERE 
       dbo.dumpfile_doroud.msisdn = dbo.dumpfile139202.msisdn) 
              + (SELECT sms_count_on_net 
              FROM dbo.dumpfile139203 
              WHERE 
       dbo.dumpfile_doroud.msisdn = dbo.dumpfile139203.msisdn) 

P.S:dumpfile_doroud是小表,但其他三個表真的很大。

+0

有沒有辦法讓那個可見的塊?而不是水平。滾動? – Coffee

+0

好的nevernmind。謝謝新鮮! – Coffee

+2

這很可能是缺少適當索引引起的問題。我們需要查看所有四個表上的索引。和/或查詢計劃。 – RBarryYoung

回答

2

試試這個:

UPDATE t1 
SET t1.sms_count_on_net=isnull(t2.sms_count_on_net,0) + 
         isnull(t3.sms_count_on_net,0) + 
         isnull(t4.sms_count_on_net,0) 
FROM dbo.dumpfile_doroud t1 
LEFT JOIN dbo.dumpfile139201 t2 
ON t2.msisdn = t1.msisdn 
LEFT JOIN dumpfile139202 t3 
ON t3.msisdn = t1.msisdn 
LEFT JOIN dumpfile139203 t4 
ON t4.msisdn = t1.msisdn 

我不認爲這是可能做出更快的查詢,所以你可以嘗試把索引。我認爲您可以在所有表​​上的列msisdn上創建非聚簇索引。語法:

CREATE NONCLUSTERED INDEX IX_doroud_dumpfile139201 
    ON dbo.dumpfile139201(msisdn); 

您可以運行SQL Management Studio並打開display estimated execution plan這有時會在創建索引的良好建議。

+0

仍然這麼費時...... –

+0

嘗試運行每個查詢,並在查詢之前放置'SET STATISTICS TIME ON',並在查詢之後放置SET STATISTICS TIME OFF。並粘貼我的查詢和你的結果。我認爲這個查詢可以通過索引更快。如果你可以把XML計劃... – Justin

+0

它比我的速度快,但仍然需要變得更快。請閱讀我添加到我的問題中的那一行。我正在考慮創建3個視圖並對它們運行查詢... –

0

創建一個子查詢來計算,則合計表連接到它

UPDATE o 
SET o.sms_count_on_net = n.sms_count_on_net 
FROM 
dbo.dumpfile_doroud o 
JOIN 
(SELECT 
d.msisdn, sms_count_on_net = (d1.sms_count_on_net+d2.sms_count_on_net+d3.sms_count_on_net) 
FROM 
dbo.dumpfile_doroud d 
LEFT JOIN dbo.dumpfile139201 d1 ON d1.msisdn = d.msisdn 
LEFT JOIN dbo.dumpfile139202 d2 ON d2.msisdn = d.msisdn 
LEFT JOIN dbo.dumpfile139203 d3 ON d3.msisdn = d.msisdn) n 
ON o.msisdn = n.msisdn 

注意,如果該值從任何這些表的失蹤總將是無效的。這可能是也可能不是你想要的

+0

如果每日表是比真實更新然後加入性判據主要的一個小了很多 「WHERE d1.msisdn IS NOT NULL或d2.msisdn IS NOT NULL或d3.msisdn IS NOT NULL」將取消的按鍵時不匹配,這可能會加快速度。另一種解決方案也是如此 –