Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 远程删除和插入/相同联接的不同执行计划_Performance_Sql Server 2008_Linked Server_Sql Execution Plan_Synonym - Fatal编程技术网

Performance 远程删除和插入/相同联接的不同执行计划

Performance 远程删除和插入/相同联接的不同执行计划,performance,sql-server-2008,linked-server,sql-execution-plan,synonym,Performance,Sql Server 2008,Linked Server,Sql Execution Plan,Synonym,我在一个环境中工作,在这个环境中,数据存在于许多客户机数据库中,并且通过sql一个接一个地被拉入中央数据存储库 为了自动化测试过程,我编写了一个非常好的、简化的按钮脚本,用于备份、清除和重新提取用户指定客户端数据库上的数据。然后从备份表中恢复数据。它大量使用同义词来简化代码 我在清除过程中遇到了性能问题,删除查询会导致远程扫描。它与INSERT/SELECT完全相同,INSERT/SELECT只是作为远程查询传递 这个插页效果很好: INSERT INTO origChild SELEC

我在一个环境中工作,在这个环境中,数据存在于许多客户机数据库中,并且通过sql一个接一个地被拉入中央数据存储库

为了自动化测试过程,我编写了一个非常好的、简化的按钮脚本,用于备份、清除和重新提取用户指定客户端数据库上的数据。然后从备份表中恢复数据。它大量使用同义词来简化代码

我在清除过程中遇到了性能问题,删除查询会导致远程扫描。它与INSERT/SELECT完全相同,INSERT/SELECT只是作为远程查询传递

这个插页效果很好:

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
    bakChild
FROM
    bakParent par
    JOIN bakChild child ON par.GUID = child.GUID
WHERE
    par.DateInserted = '2013-08-12 20:30:42.920'
下面是估计的查询执行计划。远程扫描提取5M+条记录,而插入/选择仅处理约16000条记录

我不明白为什么计划如此不同。我知道对链接服务器的查询可能会导致性能问题,但这两个连接是相同的。我希望他们是一样的。(或者应该有一种方法让DELETE执行与INSERT类似的操作。)

我已经确认在第一个查询中删除插入部分具有相同的执行计划

有什么建议吗


您能告诉我们bakChild、bakParent和origChild在哪里吗?从外观上看,第一个计划只是将所有优化逻辑抛给另一个服务器。第二个计划的做法有所不同,因为它必须执行删除,并且出于任何原因,它认为将数据拉到本地服务器并在此处执行哈希匹配更有效。您可以尝试使用
内部远程联接
…强制执行不同的行为。这两个查询最初在单个脚本中运行。bakParent/bakChild/origParent并非都存在于同一远程数据库中。我尝试了内部远程联接,但执行计划仍使用远程扫描。如果有什么不同的话,这个计划看起来更复杂(您是否考虑过在远程系统上创建存储过程,并远程执行该存储过程?这会阻止本地服务器考虑承担任何责任。这肯定会解决问题。但脚本的目标是不要求删除/客户端数据库上存在任何代码。我只需要一个按钮脚本,它可以从中央存储库类型的数据库运行,该数据库将根据用户指定的服务器/数据库参数处理数据。