2012-04-18 73 views
3

我有一个SQL查询,它用于提取报表的数据。它的工作原理,只需要拉长报告的时间就太长了。有什么办法可以优化这个SQL?这是一个包含多个子查询的SELECT查询,使用名为SYSPROD1的链接服务器。我已经尝试过但没有取得任何成功。这是我的SQL:使用链接服务器优化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 

回答

3

您在此处编写的排序的关联服务器查询(远程服务器上的多个表连接在一起)通常效果不佳,因为SQL引擎无法使用许多技巧来优化本地查询计划;例如,除非用于连接到链接服务器的安全上下文是sysadmin,db_owner或​​角色the calling server has no access to the table statistics的成员。 在执行查询期间,查询计划很可能会将SYSPROD1.SysproCompanyD.dbo.InvMaster,SYSPROD1.SysproCompanyD.dbo.SalProductClassSYSPROD1.SysproCompanyD.dbo.InvWarehouse的全部内容重新提交给调用机器,这是花费时间的。

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

第二,假设整个查询可以通过链接服务器上的表来满足,那么将创建它作为该服务器上的一个视图 - 这意味着所有的处理都在那里进行,应该更多高效。

+0

非常感谢您,在Linked服务器上创建视图并将其视为非常好,将时间缩短到最初的近十分之一。 – Scott 2012-04-18 09:07:14

+0

我的本地服务器上的临时表对我来说非常合适。做了一个'SELECT INTO',将我需要的行放入临时表中,该临时表运行得非常快,然后使用临时表连接到本地表。好的提示! – 2015-09-29 12:50:50

0

您可以JOIN小号优化它:

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你的子查询。

+0

谢谢,这工作了一下,但我的查询仍然有点太长时间运行。 – Scott 2012-04-18 09:07:53