我有一个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
答案 0 :(得分:3)
您在此处编写的排序(连接远程服务器上的多个表)的链接服务器查询通常表现不佳,因为SQL引擎无法使用它用于优化本地查询计划的许多技巧;例如,除非用于连接到链接服务器的安全上下文是sysadmin
,db_owner
或db_ddladmin
角色the calling server has no access to the table statistics的成员。
在执行查询期间,此查询的计划可能会将SYSPROD1.SysproCompanyD.dbo.InvMaster
,SYSPROD1.SysproCompanyD.dbo.SalProductClass
和SYSPROD1.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
中的每个子查询重复上述步骤。