2012-11-06 106 views
1

我寫了一個查詢,其中創建了一個字符串,並根據條件從表中獲取不同的值。提高SQL Server查詢性能

該表格有大約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 
+1

檢查你的索引。 – ppeterka

+0

在演示示例中,pmId是主鍵 – Shah

+1

您的表的結構和定義了哪些索引? – GolfWolf

回答

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

0

本作會幫助:

  1. 如果你可以從你的SELECT語句刪除截然不同這個查詢會加快不少。很多時候,我處理的客戶端或系統的Web部分的不同價值,如視覺基本,PHP,C#等 請刪除不同的關鍵字和時間再次執行它至少兩次您的查詢。但是,如果您無法刪除不同的文件,只需將其保留在那裏即可。

  2. 這很重要:將聚簇索引掃描轉換爲聚簇索引seek或僅索引seek。這會加快你的查詢不少。您通過修改索引來從索引掃描獲取索引查找。通常,聚集索引掃描來自於具有聚集索引的列的比較,其中多次是主鍵。我懷疑這列portside.sitecodeid

最好的問候,

的Tončikorsano