2017-08-16 34 views
0

我在SQL Server中具有table1更新值

id start end  value  flag main_name 
---------------------------------------------------- 
1  10  20.2 pending  T  abc 
2  22  11  pending  T  abc 
3  12.1 15  pending  F  abc 

我有另一个表table2

id start end  value flag main_name 
------------------------------------------------- 
1  10  20.2 x  T  abc 
2  22  11  y  T  abc 
3  12.1 15  z  F  abc 

我想更新table1与价值观开始和结束从table1pendingtable2相应的值为相同的开始和结束。

这只是一个例子,我在table1中有100k +个记录。

我写了一个更新查询:

UPDATE t1 
SET t1.value = t2.value 
FROM table1 t1 
JOIN table2 t2 ON t1.start = t2.start AND t1.end = t2.end 
       AND t2.value NOT LIKE 'pending' 
       AND t1.value LIKE 'pending' 
WHERE t1.main_name = 'abc' 
    AND t2.main_name = 'abc' 

但这服用大量的时间!它每秒只更新3-4行! 而且我有100k +行更新。

是否有任何其他方式/查询优化来减少时间?

*注:表中包含了比“ABC”

+1

更详细的答案可以在这里找到https://dba.stackexchange.com/questions/47134/updating-a-table-efficiently-using-join –

+0

当你做它作为选择?如果速度很快,并且如果这是一次性操作,则可以考虑从选择的结果中创建一个新表格,转储原始表格并重命名新表格以取代它 –

+0

@CaiusJard不是一个好选择,因为为每个main_name我不能创建另一个表 – Shubham

回答

0

光标是更好的选择太以外的其他main_name值,请仔细阅读本答案https://stackoverflow.com/a/21148988/7942868。正如您在使用更新时看到的那样,SQL将通过数据库创建事务,因此会产生开销。