链接服务器上的 SQL Server 更新查询导致远程扫描

Rob*_*obo 6 sql-server linked-server

我将 SQL Server 2012 设置为 SQL Server 2008 服务器上的链接服务器。

以下查询在不到 1 秒内执行:

   SELECT kg.IdGarment
   FROM Products p 
   INNER JOIN ZAMStaffRentals r ON r.ProductID = p.UniqueID 
   INNER JOIN ZAMCustomer_Staff s ON r.StaffID = s.UniqueID 
   INNER JOIN ZAMRentalGarments g ON g.StaffRentalID = r.UniqueID 
   INNER JOIN [REMOTE_SERVER].[REMOTE_DB].dbo.t_ProcessIT_Garment kg on g.BarcodeRFID = kg.IdGarment 
   INNER JOIN ZAMKannChanges log on log.GarmentID = g.UniqueID 
   WHERE log.ActionType = 'I' 
Run Code Online (Sandbox Code Playgroud)

t_ProcessIT_Garment包含 37,000 行,查询返回两条记录,IdGarment 列为主键。这里没问题。

但是,如果我运行此查询进行远程更新,则需要 24 秒,并且会影响 2 行:

   UPDATE [REMOTE_SERVER].[REMOTE_DB].dbo.t_ProcessIT_Garment SET 
   IdGarment = IdGarment
   FROM Products p 
   INNER JOIN ZAMStaffRentals r ON r.ProductID = p.UniqueID 
   INNER JOIN ZAMCustomer_Staff s ON r.StaffID = s.UniqueID 
   INNER JOIN ZAMRentalGarments g ON g.StaffRentalID = r.UniqueID 
   INNER JOIN [REMOTE_SERVER].[REMOTE_DB].dbo.t_ProcessIT_Garment kg on g.BarcodeRFID = kg.IdGarment 
   INNER JOIN ZAMKannChanges log on log.GarmentID = g.UniqueID 
   WHERE log.ActionType = 'I' ;
Run Code Online (Sandbox Code Playgroud)

我测试使用IdGarment = IdGarment以保持简单。执行计划显示它对第一个查询使用远程查询,但对第二个查询使用远程扫描,其成本为 100%。

两个查询中的表连接是相同的,为什么它对第二个查询使用远程扫描,我该如何解决这个问题?

Mit*_*eat 1

您对链接服务器上的表有足够的权限吗?此行为记录在联机丛书中:使用分布式查询的指南

要在使用链接服务器上的表时创建最佳查询计划,查询处理器必须具有来自链接服务器的数据分布统计信息。对表的任何列拥有有限权限的用户可能没有足够的权限来获取所有有用的统计信息,并且可能会收到效率较低的查询计划并体验较差的性能。如果链接服务器是 SQL Server 实例,要获取所有可用统计信息,用户必须拥有该表或者是链接服务器上 sysadmin 固定服务器角色、db_owner 固定数据库角色或 db_ddladmin 固定数据库角色的成员。