12

SQLServer2012を実行しています。

最も基本的な形式にストライプ化すると、次のようになるクエリがあります。

SELECT COUNT(DISTINCT fullAddress) as quickCount 
FROM leads
WHERE yearID >=12 AND yearID <=21

リードテーブルには、約1億4900万件のレコードが含まれています。LeadIDにクラスター化インデックスがあり、YearIDにインデックスがあり、fullAddressにインクルードがある非クラスター化インデックスがあります。

このクエリはそのまま実行すると約40秒かかります。私はそれが悪いことではないことを理解していますが、この状況ではそれは十分に速くありません。

実行計画を調べたところ、コストの約60%がDISTINCTCOUNTであることがわかりました。

このようにDISTINCTCOUNTなしで同じクエリを実行すると、次のようになります。

SELECT COUNT(*) as quickCount 
FROM leads
WHERE yearID >=12 AND yearID <=21

実行には1秒しかかかりません。

残念ながら、個別の完全なアドレスの数を取得する必要があります。だから私は最初のクエリをより速く実行するために私ができることがあるかどうかを理解しようとしています。

両方のクエリの実行プランのスクリーンショットを次に示します。

ここに画像の説明を入力してください

大きく表示するためのリンクは次のとおりです-http ://www.sequenzia.com/execPlan.jpg

私の主な問題は、Distinct Sort(52%)です。

これに関するヘルプやフィードバックは素晴らしいでしょう。

ありがとう!

アップデート

私はThiloのアドバイスを受けて、このインデックスを適用しました。

 CREATE INDEX IDX_X ON LEADS(FULLADDRESS, YEARID);

私は実際に、それぞれにまったく同じ100万レコードを含む2つの新しいテストテーブルを作成しました。同じ元のインデックスを両方に適用し、次に上記のインデックスを1つだけに適用しました。同じ実行プランで2つのテーブルを比較すると、上記のインデックスを持つテーブルの方が48%から52%少し良くなっています。これが新しい実行プランです-http://www.sequenzia.com/execPlan2.jpg

それはいくつかの助けになりますが、私は本当にもっとパフォーマンスが必要です。他に何かアイデアはありますか?

4

4 に答える 4

3

試してみる1つのことは、インデックスを並べ替えることによって並べ替えを取り除くことです(これには、where句も満たすことができるように列fullAddressも含まれます)。yearID

CREATE INDEX IDX_X ON LEADS(FULLADDRESS, YEARID);

このようにして、高速フルインデックススキャンを取得する必要があります(おそらく、不明瞭なカウントの場合のインデックス範囲スキャンよりも低速ですが、40代の並べ替えよりも高速であることが望ましいです)。

しかし、なぜこれほど高速である必要があるのでしょうか。これはあなたがいつもしなければならないことではありませんよね?これが公開Webサイトの場合は、キャッシュされた結果が少し古くなっていると思います。

于 2012-12-18T00:51:43.623 に答える
0

このテーブルを頻繁に更新しない場合は、実行しているクエリでインデックス付きビューを作成することを検討できます http://msdn.microsoft.com/en-us/library/aa933148(v=sql.80).aspx

于 2012-12-18T04:44:59.483 に答える