远程DELETE和INSERT /相同JOIN的不同执行计划

时间:2013-08-14 22:30:21

标签: performance sql-server-2008 linked-server sql-execution-plan synonym

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

有什么建议吗?

enter image description here

0 个答案:

没有答案