Performance 远程删除和插入/相同联接的不同执行计划
我在一个环境中工作,在这个环境中,数据存在于许多客户机数据库中,并且通过sql一个接一个地被拉入中央数据存储库 为了自动化测试过程,我编写了一个非常好的、简化的按钮脚本,用于备份、清除和重新提取用户指定客户端数据库上的数据。然后从备份表中恢复数据。它大量使用同义词来简化代码 我在清除过程中遇到了性能问题,删除查询会导致远程扫描。它与INSERT/SELECT完全相同,INSERT/SELECT只是作为远程查询传递 这个插页效果很好: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
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并非都存在于同一远程数据库中。我尝试了内部远程联接,但执行计划仍使用远程扫描。如果有什么不同的话,这个计划看起来更复杂(您是否考虑过在远程系统上创建存储过程,并远程执行该存储过程?这会阻止本地服务器考虑承担任何责任。这肯定会解决问题。但脚本的目标是不要求删除/客户端数据库上存在任何代码。我只需要一个按钮脚本,它可以从中央存储库类型的数据库运行,该数据库将根据用户指定的服务器/数据库参数处理数据。