查询性能不是我所期望的

时间:2015-01-29 19:10:50

标签: tsql sql-server-2008-r2

我对SQL Server 2008 R2中的一个大表(接近5000万条记录)和一个小表(平均可能是1000条记录)进行了以下查询:

UPDATE aa 
SET col1 = bb.col1, 
    col2 = bb.col2
FROM 
    tblBIG aa
INNER JOIN 
    #tempTblSmall bb ON aa.colMatchA = bb.colMatchA
                      AND aa.colMatchB = bb.colMatchB
                      AND aa.colMatchC = bb.colMatchC
                      AND aa.colMatchD = bb.colMatchD
WHERE
    aa.colMatchD >= @DateChanged

查询在大约10秒内运行,这是好的,但不是很好,所以我正在尝试对其进行优化,并提出以下更改:

UPDATE aa 
SET col1 = bb.col1, 
    col2 = bb.col2
FROM 
    tblBIG aa
INNER JOIN
    #tempTblSmall bb ON aa.colMatchA = bb.colMatchA
                       AND aa.colMatchB = bb.colMatchB
                       AND aa.colMatchC = bb.colMatchC
                       AND aa.colMatchD = bb.colMatchD
WHERE
    aa.colMatchA = @Param1
    AND aa.colMatchB = @Param2
    AND aa.colMatchD >= @DateChanged

这大大缩短了查询运行时间(此时基本上是立即的),但我不确定为什么这是有效的。临时表#tempTblSmall已限制为@Param1@Param2,因此我原以为我不需要另一组where子句。

我很高兴我设法提高了性能,但我很想知道我是否幸运并设法将查询计划程序纳入更好的估算计划,或者我只是误解了SQL Server如何计划内部联接并应该做这样的事情。我认为SQL Server会因为连接而有一个隐含的where子句,但是显然限制大表是在连接之前完成的吗?

1 个答案:

答案 0 :(得分:0)

因此临时表仅限于@ Param2 @DateChanged

这些条件在大桌上

我会把条件拉入联接

Update aa 
   set aa.col1 = bb.col1, 
       aa.col2 = bb.col2
  from tblBIG aa
  join #tempTblSmall bb
    on aa.colMatchA = bb.colMatchA
   and aa.colMatchB = bb.colMatchB
   and aa.colMatchC = bb.colMatchC
   and aa.colMatchD = bb.colMatchD
   and aa.colMatchA =  @Param1
   and aa.colMatchB =  @Param2
   and aa.colMatchD >= @DateChanged
   and (aa.col1 <> bb.col1 or aa.col2 <> bb.col2)