如何改进下一个SQL Server查询?
SELECT SUM(Qty)
FROM Products
WHERE Type = 'SODA'
AND (Code LIKE 'A5%'
OR Code IN('DHA2','JHU8','KML2','LQA1','ZSX2'))
需要花费大量时间执行。
提前致谢。
我通过Linked Server从DB2数据库获取数据。我不能只是阅读建立索引。
Id int
Name nvarchar(100)
Type nvarchar(100)
Code nvarchar(100)
Qty int
答案 0 :(得分:5)
首先,尝试在products(type, code, qty)
上创建索引。这可能会大大提高性能。
然后,如果这不起作用,请尝试将查询重写为:
select sum(qty)
from ((select qty
from products
where type = 'SODA' and
code like 'A5%'
) union all
(select qty
from products
where type = 'SODA' and
code IN ('DHA2','JHU8','KML2','LQA1','ZSX2'))
)
) t;
这可能看起来更复杂,但有时or
会干扰查询优化。
答案 1 :(得分:2)
这是一个链接服务器查询。你没有说明你如何执行它,所以我假设它正在使用FROM中的链接服务器名称。如果您查看查询计划,您将看到的只是远程查询 - >计算机标量 - >选择。这基本上意味着您想要计算的所有数据都被复制到tempDB然后计算。
如果您在EXEC或EXENQUERY执行查询,则远程执行查询,那么唯一要返回的是结果。
试试这个:
select *
from
openquery(LinkedServerName, '
SELECT SUM(Qty) Total
FROM Products
WHERE Type = ''SODA''
AND (Code LIKE ''A5%''
OR Code IN(''DHA2'',''JHU8'',''KML2'',''LQA1'',''ZSX2'')) ')
答案 2 :(得分:0)
由于您使用的是链接服务器,并且您也进行了字符串比较,我很确定您的性能低下是因为SQL Server必须将整个Product表从DB2数据库带到本地副本,然后根据您的比较来比较字符串当前的整理设置。您会看到,比较字符串在不同的排序规则设置和不同的数据库系统上可能会有不同的结果。在Microsoft SQL Server数据库之间进行链接时,您可以启用Collation兼容性,因此在执行查询时,它将信任链接服务器关于字符串比较和排序的决策。我不知道Microsoft SQL Server和DB2之间是否可以进行排序规则兼容性。因此问题的解决方案是使用OPENROWSET而不是链接服务器。
这样的事情:
SELECT * FROM OPENROWSET
('DB2OLEDB',Netlib=SNA;NetAddr=;NetPort=;RemoteLU=OLYMPIA;LocalLU=LOCAL;ModeName=QPCSUPP;User ID=WNW3XX;Password=WNW3XX;InitCat=OLYMPIA;Default Schema=WNW3XX;PkgCol=WNW3XX;TPName=;Commit=YES;IsoLvl=NC;AccMode=;CCSID=37;PCCodePage=1252;BinAsChar=NO;Data Source=Sample',
'SELECT SUM(Qty)
FROM Products
WHERE Type = ''SODA''
AND (Code LIKE ''A5%''
OR Code IN(''DHA2'',''JHU8'',''KML2'',''LQA1'',''ZSX2'')) ' )
在linked server to DB2 using Microsoft OLE DB provider for DB2
中查看更多信息答案 3 :(得分:0)
如果花了那么长时间,我建议你创建一个具有相同结构的表,然后构建一些有用的索引,然后对这个本地表执行查询:
DELETE FROM Products
INSERT INTO Products
SELECT * FROM RemoteServer.database_name..Products
SELECT SUM(Qty)
FROM Products
WHERE Type = 'SODA'
AND (Code LIKE 'A5%'
OR Code IN('DHA2','JHU8','KML2','LQA1','ZSX2'))