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

1 つのオプションは、計算列を作成し、その上にインデックスを作成することです。

この記事では、それについて説明しています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を削除できる場合、このクエリはかなり高速になります。多くの場合、ビジュアルベーシック、php、c# など、システムのクライアントまたは Web 部分で個別の値を処理します。少なくとも 2 回実行した後、個別のキーワードを削除して、もう一度クエリを実行してください。ただし、distinct を削除できない場合はそのままにしておいてください。

  2. これは重要です。クラスター化インデックス スキャンをクラスター化インデックス シークまたはインデックス シークのみに変換します。これにより、クエリがかなり高速化されます。インデックスを変更することにより、インデックス スキャンからインデックス シークを取得します。通常、クラスター化インデックス スキャンは、多くの場合主キーであるクラスター化インデックスを使用した列の比較から行われます。この列は portside.sitecodeid だと思います

よろしくお願いします、

トンチ・コルサノ

于 2012-11-08T15:16:09.500 に答える