テーブルに作成するインデックスを知るにはどうすればよいですか?


33

テーブルにどのインデックスを作成するのかを知る最良の方法を見つけ出す方法はありますか?


11
がある。たとえば、use-the-index-luke.comを試してください。
-dezso

私が最も見た答えは、WHERE句で使用する主キーと列にインデックスを付ける必要があるということです。
オスカーパーソン

しないでください。主キーは、データがテーブル上で物理的にソートされる方法を定義し、独自の考慮事項があります。主キーは他のすべてのインデックスでも使用されるため、慎重に選択する必要があります。参照するには:sqlskills.com/blogs/kimberly/...
アリRazeghi

4
@AliRazeghi(物理的なソート)は、特定のDBMS(特定の状況下)で当てはまり、他のDBMSでは当てはまりません。たとえば、PostgreSQLには当てはまりません。
-dezso

投票し直します!
アリラゼギ

回答:


29

短い経験則。(これらの一部は自動的に作成されますが、dbmsに応じて後で手動で削除することもできます。PostgreSQLで常に作業すると想定しないでください。)

  • すべての主キーにインデックスを付けます。
  • すべての外部キーにインデックスを付けます。
  • JOIN句で使用されるすべての列にインデックスを付けます。
  • WHERE句で使用されるすべての列にインデックスを付けます。
  • ドキュメントを調べて、dbmsがサポートする「難解な」インデックス付けオプションを学習します。

すべての主キーは、複数列の主キーがすべての列をカバーする単一のインデックスを持つ必要があることを意味します。複数列の主キーを宣言すると、PostgreSQLはこのインデックスを自動的に作成します。

単一のマルチカラムインデックスを使用すると、複数のシングルカラムインデックスよりもパフォーマンスが向上する場合が多くあります。遅いクエリ監視し、テストを実行して、どちらが正しいかを判断します。

インデックス作成を変更すると、一部のデータベースアクティビティが改善され、他のアクティビティが低下すると想定します。インデックスを変更する前後にプロファイルできるSQLステートメントのセットがあると便利です。このセットには、SELECT、INSERT、UPDATE、およびDELETEステートメントが含まれます。

特定のdbmsのドキュメントを勉強することに代わるものはありません。

  • インデックス作成
  • インデックス(特に、式のインデックス付け、部分インデックス、およびインデックス使用の調査に関するセクションに注意してください)

14

@Catcallがすでに提供しているものに加えて、小さな修正を追加します:

また、最近この密接に関連したSOの回答でいくつかの基本事項を取り上げました

これまでの回答は、主キーにインデックスを作成する必要があることを示しているようですが、PostgreSQLではそうではありません(部分的な例外が適用されます)。私はここでマニュアルを引用します

PostgreSQLは、テーブルに一意の制約または主キーが定義されている場合、一意のインデックスを自動的に作成します。インデックスは、主キーまたは一意の制約(適切な場合は複数列インデックス)を構成する列をカバーし、制約を実施するメカニズムです。

大胆な強調鉱山。

複数列インデックスの2番目以降の列に追加のインデックスを作成することもできますが、通常、最初のインデックスは追加の列でインデックスが大きくなる場合を除き、複数列インデックスで十分にカバーされます。この関連する質問の下で詳細に議論しました:

複合インデックスは、最初のフィールドのクエリにも適していますか?

マルチカラムインデックス部分インデックス、および式のインデックスは、PostgreSQLの特に強力なツールです。PostgreSQL 9.2以降、インデックスのみのスキャンもあります。これは、他のRDBMSの「インデックスのカバー」に相当します。これは別の種類のインデックスではなく、既存のインデックスタイプを使用したRDBMSの新しい機能です。

すべてのインデックスには特定のコストがかかるため、基本的な知識に基づいてインデックス作成を実際に最適化する方法はありません。より多くのインデックスを作成するだけで、良いことよりも害になることがあります。特に、インデックスを使用すると、HOT更新によるパフォーマンスの向上を防ぐことができます

一般的に、書き込み操作(DELETEUPDATE)はより高価になります(しかし、利益もあるかもしれません!)が、読み取り操作(SELECT)は一般に利益があります。インデックスが多すぎると、キャッシュメモリが使い果たされる可能性があるため、読み取り操作でも問題が発生する可能性があります。

最後に、インデックス管理に関するこのPostgres Wikiページは、(特に)重複または未使用のインデックスを見つけるためのツールを備えています。


私は右覚えている場合は、PKを超える自動インデックスは、Oracle vに作成された> = 10とSQL Server> = 2008。
EAmez

1

2つのオプションがあります。

  1. あなたはそれを行う。
  2. 技術はそれを行います。

自分でそれを行うための答えは、かなり徹底的にここに文書化されています。それでは、別のものを見てみましょう。

Pghero

自動化されたアドバイスが必要な場合は、Pgheroが支援できる場合があります。

それはいくつかの欠点があると言いました。

  1. それだけで動作WHEREしてORDER BYいません、JOINS
  2. NULLパーセントの統計と個別の値のみを使用します。

詳細については、このビデオをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.