我在一个环境中工作,在这种环境中,数据存在于众多客户端数据库中,并且逐个通过sql将其拉入中央数据存储库。
为了自动化测试过程,我编写了一个非常好的,简化的按钮脚本,用于在用户指定的客户端数据库上备份,清除和重新提取数据。然后它从备份表中恢复数据。它大量使用同义词来简化代码。
我遇到了清除过程中出现性能问题,其中DELETE查询导致远程扫描。它与INSERT / SELECT完全相同,只是作为远程查询传递。
这个INSERT效果很好:
INSERT INTO origChild
SELECT child.*
FROM
bakParent par
JOIN bakChild child ON par.GUID = child.GUID
WHERE
par.DateInserted = '2013-08-12 20:30:42.920'
此DELETE表现不佳:
DELETE
bakChild
FROM
bakParent par
JOIN bakChild child ON par.GUID = child.GUID
WHERE
par.DateInserted = '2013-08-12 20:30:42.920'
以下是估计的查询执行计划。远程扫描提取5M +记录,而INSERT / SELECT仅处理约16,000条记录。
我无法弄清楚为什么计划如此不同。我知道对链接服务器的查询可能会导致性能问题,但两个JOIN是相同的。我希望它们是一样的。 (或者我应该有办法让DELETE执行与INSERT类似的操作。)
我已经确认在第一个查询中删除INSERT部分具有相同的执行计划。
有什么建议吗?