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