テーブルにどのインデックスを作成するのかを知る最良の方法を見つけ出す方法はありますか?
WHERE
句で使用する主キーと列にインデックスを付ける必要があるということです。
テーブルにどのインデックスを作成するのかを知る最良の方法を見つけ出す方法はありますか?
WHERE
句で使用する主キーと列にインデックスを付ける必要があるということです。
回答:
短い経験則。(これらの一部は自動的に作成されますが、dbmsに応じて後で手動で削除することもできます。PostgreSQLで常に作業すると想定しないでください。)
すべての主キーは、複数列の主キーがすべての列をカバーする単一のインデックスを持つ必要があることを意味します。複数列の主キーを宣言すると、PostgreSQLはこのインデックスを自動的に作成します。
単一のマルチカラムインデックスを使用すると、複数のシングルカラムインデックスよりもパフォーマンスが向上する場合が多くあります。遅いクエリを監視し、テストを実行して、どちらが正しいかを判断します。
インデックス作成を変更すると、一部のデータベースアクティビティが改善され、他のアクティビティが低下すると想定します。インデックスを変更する前後にプロファイルできるSQLステートメントのセットがあると便利です。このセットには、SELECT、INSERT、UPDATE、およびDELETEステートメントが含まれます。
特定のdbmsのドキュメントを勉強することに代わるものはありません。
@Catcallがすでに提供しているものに加えて、小さな修正を追加します:
また、最近、この密接に関連したSOの回答でいくつかの基本事項を取り上げました。
これまでの回答は、主キーにインデックスを作成する必要があることを示しているようですが、PostgreSQLではそうではありません(部分的な例外が適用されます)。私はここでマニュアルを引用します:
PostgreSQLは、テーブルに一意の制約または主キーが定義されている場合、一意のインデックスを自動的に作成します。インデックスは、主キーまたは一意の制約(適切な場合は複数列のインデックス)を構成する列をカバーし、制約を実施するメカニズムです。
大胆な強調鉱山。
複数列インデックスの2番目以降の列に追加のインデックスを作成することもできますが、通常、最初のインデックスは追加の列でインデックスが大きくなる場合を除き、複数列インデックスで十分にカバーされます。この関連する質問の下で詳細に議論しました:
複合インデックスは、最初のフィールドのクエリにも適していますか?
マルチカラムインデックス、部分インデックス、および式のインデックスは、PostgreSQLの特に強力なツールです。PostgreSQL 9.2以降、インデックスのみのスキャンもあります。これは、他のRDBMSの「インデックスのカバー」に相当します。これは別の種類のインデックスではなく、既存のインデックスタイプを使用したRDBMSの新しい機能です。
すべてのインデックスには特定のコストがかかるため、基本的な知識に基づいてインデックス作成を実際に最適化する方法はありません。より多くのインデックスを作成するだけで、良いことよりも害になることがあります。特に、インデックスを使用すると、HOT更新によるパフォーマンスの向上を防ぐことができます。
一般的に、書き込み操作(DELETE
、UPDATE
)はより高価になります(しかし、利益もあるかもしれません!)が、読み取り操作(SELECT
)は一般に利益があります。インデックスが多すぎると、キャッシュメモリが使い果たされる可能性があるため、読み取り操作でも問題が発生する可能性があります。
最後に、インデックス管理に関するこのPostgres Wikiページは、(特に)重複または未使用のインデックスを見つけるためのツールを備えています。