合計列にインデックスを付ける
-
22-07-2019 - |
質問
合計されている列のインデックスを作成する方が、インデックスがないよりも高速ですか?
解決
申し訳ありませんが、あなたが何を求めているのか明確ではありません。
ご質問の場合、次のようなクエリが高速化されますか
SELECT product, sum(quantity) FROM receipts
GROUP BY product
数量に関するインデックスを追加した場合
それが質問であれば、答えはノーです。一般的に、インデックスは、多くの行の中から数行だけを見つける必要がある場合に役立ちます。ここではすべての行が必要なので、インデックスは役に立ちません。
あいまいな例外があります(ほとんどのDBオプティマイザーがこのトリックの実装を気にすることはめったにありません)。クエリがたまたま
SELECT sum(foo) FROM bar
、fooにインデックスがあり、barが多くの列を持つテーブルである場合、完全なインデックスを読み込むことができ、基礎となるテーブルを読み込む場合よりも小さなヒットを被り、インデックス-「本物」に触れる必要はありません。テーブルで!ただし、これは非常にまれなケースであり、オプティマイザーがこれに依存する前にこれを行うことを知っていることをテストする必要があります。
他のヒント
いいえ。インデックスは、必要なチェックの数を制限することにより、検索を改善します。集計関数(カウント、最大、最小、合計、平均)は、列のすべてのエントリに関係なく実行する必要があります。
合計をより速くしたい場合は、結果を事前に実体化できます。 Oracleでは Materialized Views を使用し、MS SQLではインデックス付きビュー。
特定の質問「合計されている列のインデックスを作成する方がインデックスがない場合よりも速いですか?」、答えは「いいえ」です
あなたの質問に対する答えは、スペンサーの答えにあります:
"集計関数(count、max、min、sum、avg)は、関係なく合計される列のすべてのエントリを実行する必要があります。
スペンサーの答えの列のコンテキストを明確にしました。それでも彼の答えは正しい。
インデックスがカバーしている場合、一般に高速になります。どれくらい速くなるかは、テーブルの列数とインデックスの数の差によって決まります。さらに、フィルタリング基準がある場合は高速になる可能性があります。
where(productid here)の列にインデックスを付けると、このクエリを使用するのに役立ちます:
製品IDを選択、領収書からのsum(quantity)WHERE productid = 1 GROUP BY productid
インデックスを追加すると、クエリの1つが45秒からほぼ瞬時になりました。