1

我编写了一个查询,在该查询中创建了一个字符串并根据条件从表中获取不同的值。

该表有大约 5000 行。此查询需要将近 20 秒才能执行。

我相信字符串比较使查询变得如此缓慢。但我想知道我的替代方案是什么。

询问:

select distinct
   Convert(nvarchar, p1.trafficSerial) +' ('+  p1.sourceTraffic + ' - ' + p1.sinkTraffic + ' )' as traffic
from 
   portList as p1
inner join 
   portList as p2 ON p1.pmId = p2.sinkId
                  AND P1.trafficSerial IS NOT NULL 
                  AND (p1.trafficSerial = p2.trafficSerial) 
                  AND (P1.sourceTraffic = P2.sourceTraffic) 
                  AND (P1.sinkTraffic = P2.sinkTraffic)
where 
   p1.siteCodeID = @SiteId
4

2 回答 2

3

一种选择是创建一个计算列并在其上创建一个索引

本文讨论它http://blog.sqlauthority.com/2010/08/22/sql-server-computed-columns-index-and-performance/

ALTER TABLE dbo.portList ADD
traffic AS Convert(nvarchar,trafficSerial) +' ('+  sourceTraffic + ' - ' + sinkTraffic + ' )' PERSISTED
GO

CREATE NONCLUSTERED INDEX IX_portList_traffic
ON dbo.portList  (traffic)
GO

select distinct traffic from dbo.portList 

您还应该确保连接关系中的每一列都有索引:

p1.trafficSerial & p2.trafficSerial
P1.sourceTraffic & P2.sourceTraffic
P1.sinkTraffic & P2.sinkTraffic

和过滤器的列:p1.siteCodeID

于 2012-11-06T08:11:21.783 回答
0

这肯定有帮助:

  1. 如果您可以从您的 select 语句中删除 distinct,则此查询将加速很多。很多时候,我通过系统的客户端或 Web 部分处理不同的值,例如 Visual Basic、php、c# 等。请删除不同的关键字,并在执行至少两次后再次查询。但是,如果您无法删除 distinct 则只需将其留在那里。

  2. 这很重要:将聚集索引扫描转换为聚集索引查找或仅索引查找。这将大大加快您的查询速度。您通过修改索引从索引扫描中获取索引查找。通常,聚集索引扫描来自与聚集索引的列的比较,聚集索引很多时候是主键。我怀疑这个专栏是 portside.sitecodeid

最好的祝福,

通西科尔萨诺

于 2012-11-08T15:16:09.500 回答