性能调优SQL SERVER中的更新语句

时间:2015-05-15 10:21:19

标签: sql sql-server performance sql-server-2008 ssis

我有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进行适当的权限来验证执行计划。

2 个答案:

答案 0 :(得分:2)

运行第一个声明时,您应该:

  • 在table1.col2上有一个聚集索引
  • 在table2.col2
  • 上有一个聚集索引

Be ware:每个表只能有1个聚簇索引(因为这个索引说明了如何物理存储数据)并且它必须是在表上创建的第一个索引(反之亦然:你删除的最后一个索引)

行动的共同顺序:

  1. 创建表格
  2. 创建聚集索引(唯一与否,无关紧要)
  3. 创建非抽象索引
  4. 分别为:

    1. 删除非聚簇索引
    2. 删除聚集索引
    3. drop table

答案 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,那么索引就不那么有用了。如果没有索引,则需要进行全表扫描,并且不应该非常慢。

您可能会发现在此表上批量处理更新有助于提高性能。