我正在一个环境中工作,其中数据存在于众多客户端数据库中,并且通过 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 部分具有相同的执行计划。
有什么建议么?