合計される列のインデックスを作成することは、インデックスを作成しないよりも高速ですか?
5 に答える
申し訳ありませんが、あなたが何を求めているのか明確ではありません。
次のようなクエリを高速化しますか?
SELECT product, sum(quantity) FROM receipts
GROUP BY product
数量にインデックスを追加した場合は?
それが問題なら、答えはノーです。一般的に言えば、インデックスは多数の行から数行だけを検索する必要がある場合に役立ちます。ここではすべての行が必要なので、インデックスは役に立ちません。
あいまいな例外があります (ほとんどの DB オプティマイザーがこのトリックを実装することはほとんどないため、めったに適用されません)。あなたのクエリがたまたま
SELECT sum(foo) FROM bar
、 foo にインデックスがあり、 bar が多くの列を持つテーブルである場合、完全なインデックスを読み取ることが可能であり、基礎となるテーブルを読み取ってインデックスから直接回答を取得する場合よりもヒットが少なくなります -- 「本物の」テーブルに触れる必要はまったくありません!ただし、これはかなりまれなケースであり、オプティマイザーがこれを行うことを認識しているかどうかをテストしてから、これに頼りすぎる必要があります。
いいえ。インデックスは、必要なチェックの数を制限することで検索を改善します。集計関数 (カウント、最大、最小、合計、平均) は、関係なく、列内のすべてのエントリを実行する必要があります。
合計をより速くしたい場合は、結果を事前に具現化できます。Oracle ではMaterialized Viewsを使用し、MS SQL ではIndexed Viewsを使用します。
「合計される列のインデックスを作成するのは、インデックスがない場合よりも高速ですか?」という特定の質問については、答えは「いいえ」です。
あなたの質問に対する答えは、スペンサーの答えにあります。
「集計関数 (カウント、最大、最小、合計、平均) は、合計される列のすべてのエントリを無視して実行する必要があります。」
スペンサーの回答で列のコンテキストを明確にしました。それにもかかわらず、彼の答えは正しいです。
where(productid here) の列にインデックスを付けると、このクエリを使用するときに役立ちます。
SELECT productid, sum(quantity) FROM レシート WHERE productid = 1 GROUP BY productid
インデックスを追加すると、クエリの 1 つが 45 秒からほぼ瞬時になりました。