web-dev-qa-db-ja.com

インデックスとパーティション

インデックスのみではパフォーマンスを向上させることができず、テーブルパーティション分割などの他の手法が必要になるのはなぜですか?問題はパフォーマンスにのみ関係します。もちろん、異なるパーティションを異なるテーブルスペースに置くことができます。これは、インデックスでは達成できない他の効果があります。

または言い換えると、パフォーマンスに関してのみです。テーブルのパーティション分割と同じように、インデックスを使用してパフォーマンスを向上させることはできますか?

20
paweloque

いいえ、パーティション化により、一部のテーブルスキャンを特定のパーティションに制限できます。テーブルのデータの2〜4パーセント以上を返す場合、インデックスは役に立たない傾向があります。選択基準によりクエリを特定のパーティションにローカライズできる場合、他のパーティションをスキャンする必要はありません。

オプティマイザが、一部のパーティションにはテーブルスキャンを使用し、他のパーティションにはインデックスを使用することを選択できる場合があります。私はそれが起こっていることを示す説明計画を見たことがありません。

履歴データが多い場合は、現在のデータのクエリを作成して、考慮されるパーティションを現在のデータを含むパーティションに制限できます。

18
BillThor

あなたの最後の質問に直接答えるために:いいえ、私はそれらが同等であるとは思いません。 1日のデータを検索する必要がある非常に大きなテーブル(数十GB)を考えてみてください。毎日のパーティションを使用すると、スペースのペナルティなしでその日のデータのみをスキャンすることになりますが、インデックスは、十分な情報を保持しない可能性がある(また、大きなデータベースについて話すときに問題となるスペースを取る)か、そうでない可能性がある別個の構造です十分に選択的。

とにかく、インデックスとパーティションは、使用法とパフォーマンスの同じ利点を競っていません。データベースでバランスを見つける必要があります。

7
Marian