使用链接服务器优化SQL查询

使用链接服务器优化SQL查询,sql,optimization,linked-server,Sql,Optimization,Linked Server,我有一个SQL查询,用于为报表提取数据。它可以工作,只是程序拉取报告的时间太长了。有什么方法可以优化这个SQL吗?这是一个包含多个子查询的SELECT查询,使用名为SYSPROD1的链接服务器。我试过了,但没有成功。以下是我的SQL: Select invMaster.StockCode, prodclass.[Description], invMaster.LongDesc, (select inv.QtyOnHand from SYSPROD1.SysproC

我有一个SQL查询,用于为报表提取数据。它可以工作,只是程序拉取报告的时间太长了。有什么方法可以优化这个SQL吗?这是一个包含多个子查询的SELECT查询,使用名为SYSPROD1的链接服务器。我试过了,但没有成功。以下是我的SQL:

Select   
      invMaster.StockCode, prodclass.[Description],  invMaster.LongDesc,
      (select inv.QtyOnHand from SYSPROD1.SysproCompanyD.dbo.InvWarehouse inv where inv.StockCode = invMaster.StockCode and inv.Warehouse = 'P4') as CSSJHB,
      (select inv.QtyOnHand from SYSPROD1.SysproCompanyD.dbo.InvWarehouse inv where inv.StockCode = invMaster.StockCode and inv.Warehouse = 'KK') as KFCJHB,
      (select inv.QtyOnHand from SYSPROD1.SysproCompanyD.dbo.InvWarehouse inv where inv.StockCode = invMaster.StockCode and inv.Warehouse = 'KF') as KFCMIDRAND,
      (select inv.QtyOnHand from SYSPROD1.SysproCompanyD.dbo.InvWarehouse inv where inv.StockCode = invMaster.StockCode and inv.Warehouse = 'QK') as QKJHB,
      (select inv.QtyOnHand from SYSPROD1.SysproCompanyD.dbo.InvWarehouse inv where inv.StockCode = invMaster.StockCode and inv.Warehouse = 'SD') as SDBBLOEM, 
      (select inv.QtyOnHand from SYSPROD1.SysproCompanyD.dbo.InvWarehouse inv where inv.StockCode = invMaster.StockCode and inv.Warehouse = 'SL') as SEQUENCE,
      (select inv.QtyOnHand from SYSPROD1.SysproCompanyD.dbo.InvWarehouse inv where inv.StockCode = invMaster.StockCode and inv.Warehouse = 'PA') as CSSCT,
      (select inv.QtyOnHand from SYSPROD1.SysproCompanyD.dbo.InvWarehouse inv where inv.StockCode = invMaster.StockCode and inv.Warehouse = 'VL') as CSGEORGE



from        
      SYSPROD1.SysproCompanyD.dbo.InvMaster invMaster  join SYSPROD1.SysproCompanyD.dbo.SalProductClass prodclass
      on invMaster.ProductClass = prodclass.ProductClass 

  where prodclass.[Description] in ('WHOLEBIRDS','ABI & OTHER', 'CATERING PORTIONS', 'FILLETED PRODUCTS', 'FRESH PRODUCTS','INDUSTRIAL CATERING', 'IQF PORTIONS', 'LOW VALUE FIXED MASS', 'RED MEAT', 'REJECT EGGS' ,'SUNDRY PRODUCTS','VALUE ADDED')                   
    group by invMaster.StockCode, prodclass.[Description],  invMaster.LongDesc

  order by prodclass.[Description], invMaster.StockCode asc

您可以使用
JOIN
s对其进行优化:

Select    
      invMaster.StockCode, prodclass.[Description],  invMaster.LongDesc, w1.QtyOnHand AS CSSJHB


等。在
选择中对每个子查询重复此操作

您在此处编写的链接服务器查询(远程服务器上的多个表连接在一起)通常执行得很差,因为SQL引擎无法使用许多用于优化本地查询计划的技巧;例如,除非用于连接到链接服务器的安全上下文是
sysadmin
db_owner
db_ddladmin
角色的成员。 此查询的计划可能会在执行查询期间多次将
SYSPROD1.SysproCompanyD.dbo.InvMaster
SYSPROD1.SysproCompanyD.dbo.SalProductClass
SYSPROD1.SysproCompanyD.dbo.InvWarehouse
的全部内容拉回到调用机器,正是这一点花费了时间

您有几个选项可以尝试并改进此查询的性能。 一种是在查询中加入临时表或表变量之前,将链接服务器上每个表中所需的行插入到临时表或表变量中


第二,考虑到链接服务器上的表可以满足整个查询,将其创建为该服务器上的视图-这意味着所有的处理都在该服务器上执行,并且应该更加高效。

非常感谢,在链接服务器上创建视图并称其为非常有效,把时间降到了最初的十分之一。我的本地服务器上的临时表对我来说非常适合。在运行速度非常快的temp表中,我只选择了所需的行,然后使用temp表连接到本地表。好提示!谢谢,这有点奏效,但我的查询仍然有点太长。
from         
      SYSPROD1.SysproCompanyD.dbo.InvMaster invMaster  
join SYSPROD1.SysproCompanyD.dbo.SalProductClass prodclass 
      on invMaster.ProductClass = prodclass.ProductClass
INNER JOIN SYSPROD1.SysproCompanyD.dbo.InvWarehouse w1 on w1.StockCode = invMaster.StockCode AND w1.Warehouse = 'P4'