3

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

2 回答 2

3

您在此处编写的那种链接服务器查询(其中连接了远程服务器上的多个表)通常表现不佳,因为 SQL 引擎无法使用它用来优化本地查询计划的许多技巧;例如,除非用于连接到链接服务器的安全上下文是或角色的成员sysadmin,否则调用服务器无权访问表统计信息。这个查询的计划很可能会在查询执行期间多次拉取 的全部内容,并多次返回调用机器,这就是花费时间的原因。db_ownerdb_ddladminSYSPROD1.SysproCompanyD.dbo.InvMasterSYSPROD1.SysproCompanyD.dbo.SalProductClassSYSPROD1.SysproCompanyD.dbo.InvWarehouse

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

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

于 2012-04-18T08:45:35.350 回答
0

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

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.

于 2012-04-18T07:10:10.837 回答