我有2个更新语句。当一起执行时,从SSIS开始的时间超过12小时。在执行此更新语句之前,此表上的所有索引都已禁用。我需要提高性能。我需要建议:
1)第一次更新声明
Update Db1.table1
Set Db1.table1.col1 = Db2.table2.col1
from Db1.table1, Db2.table2
where Db1.table1.col2 = Db2.table2.col2
2)第二次更新声明
update table1
set table1.col3 = 0
from table1
where table1.col3 is null
批量更新有助于提高第一次更新声明的性能吗? 我看到在col3上有一个默认值就足够了,而不是运行第二次更新。但我不确定它是否会影响插入查询。该表有很多数据。我不确定是否要更改表以在表中包含大量数据的列中包含默认值。
请提供您对绩效进行调整的建议。同时请注意,我没有对DB进行适当的权限来验证执行计划。
答案 0 :(得分:2)
运行第一个声明时,您应该:
Be ware:每个表只能有1个聚簇索引(因为这个索引说明了如何物理存储数据)并且它必须是在表上创建的第一个索引(反之亦然:你删除的最后一个索引)
行动的共同顺序:
分别为:
答案 1 :(得分:2)
首先,有助于了解哪个更新需要更长时间。但是,在进行更新时,索引不一定是你的敌人。
第一次更新:
Update t1
Set t1.col1 = t2.col2
from Db1.table1 t1 join
Db2.table2 t2
on t1.col2 = t2.col2;
此更新确实需要db2.table2(col2)
上的索引。否则,它将需要执行嵌套循环连接。
第二次更新:
update table1
set table1.col3 = 0
from table1
where table1.col3 is null
有点棘手。您正在更新where
子句中的列。我的感觉是,如果相对较少的值为null
- 高达百分之几 - 则table1(col3)
上的索引会有所帮助。如果许多列为null,那么索引就不那么有用了。如果没有索引,则需要进行全表扫描,并且不应该非常慢。
您可能会发现在此表上批量处理更新有助于提高性能。