嵌套sql server更新查询的最有效方法

时间:2014-02-24 14:14:33

标签: sql sql-server query-performance

我将使用3个不同表中特定值的总和来更新表。为此,我写了这个查询。但这需要太多时间,为此目的最有效的查询是什么?

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是一个小表,但其他三个表真的很大。

2 个答案:

答案 0 :(得分: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这有时可以为创建索引提供良好的建议。

答案 1 :(得分: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

请注意,如果其中任何一个表中缺少该值,则total将为null。那可能是也可能不是你想要的