SQL Server查询可提高链接服务器的性能

时间:2014-06-24 17:08:10

标签: sql sql-server performance select sql-like

如何改进下一个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

4 个答案:

答案 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数据库之间进行链接时,您可以启用Collat​​ion兼容性,因此在执行查询时,它将信任链接服务器关于字符串比较和排序的决策。我不知道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

中查看更多信息

并在OPENROWSET (Transact-SQL)

答案 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'))