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

时间:2012-04-18 07:03:54

标签: sql optimization linked-server

我有一个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

2 个答案:

答案 0 :(得分:3)

您在此处编写的排序(连接远程服务器上的多个表)的链接服务器查询通常表现不佳,因为SQL引擎无法使用它用于优化本地查询计划的许多技巧;例如,除非用于连接到链接服务器的安全上下文是sysadmindb_ownerdb_ddladmin角色the calling server has no access to the table statistics的成员。 在执行查询期间,此查询的计划可能会将SYSPROD1.SysproCompanyD.dbo.InvMasterSYSPROD1.SysproCompanyD.dbo.SalProductClassSYSPROD1.SysproCompanyD.dbo.InvWarehouse的全部内容多次提取回调用计算机,这就是花时间。

您有几个选项可以尝试提高此查询的性能。 一种是在链接服务器上的每个表中将所需的行插入临时表或表变量,然后在查询中加入它们。

第二,鉴于链接服务器上的表可以满足整个查询,将在该服务器上创建它作为一个视图 - 这意味着所有处理都在那里执行,应该更有效率

答案 1 :(得分:0)

您可以使用JOIN s:

对其进行优化
Select    
      invMaster.StockCode, prodclass.[Description],  invMaster.LongDesc, w1.QtyOnHand AS CSSJHB

..<snip>

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'

等。对SELECT中的每个子查询重复上述步骤。