我对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子句,但是显然限制大表是在连接之前完成的吗?
答案 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)