Pergunta

I am going to update a table using the sum of specific value from 3 different tables. For this purpose I wrote this query. But it takes too much time, what is the most efficient query for this purpose?

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 is small table but other three tables are really big.

Foi útil?

Solução

Try this:

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

I don't think it's possible to make faster query, so you can try put indexes. I think you can create nonclustered index on column msisdn on all tables. Syntax:

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

You can run SQL Management studio and turn on display estimated execution plan this sometimes gives good advices on creating indexes.

Outras dicas

Create a subquery to calculate the totals then join the table to it

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

Note that if the value is missing from any of those tables the total will be null. That may or may not be what you want

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top