0

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

有什么建议么?

在此处输入图像描述

4

0 回答 0