SELECT * FROM Table WHERE ~~;
となっていたら、とりあえず「~~」の部分に記述されて記述されているカラムをインデックスにすればよいのでしょうか?
SELECTが遅いものに関しては、取り敢えずWHERE区に有る項目が対象になります。インデクス作成後にexplainで利用されているかを確認します。
SELECTの遅延が事前に予測できる場合、インデクスを貼る事を検討しても良いとは思いますが、インデクス大量に作成するのには注意が必要です。。
インデクスを沢山作成すると、INSERT,UPDATE,DELETEに負荷が掛かりますし、これらが頻繁に発生するとインデックス検索も遅くなり、REINDEXを必要とする場合が発生します。
Postgresは、テーブルを8kサイズ(default)のページに格納しますが、このページが大量となるテーブルに対してはインデクスはとても有効です。逆にページ数が少ない場合、効果がでない場合が有ります。
余談ですが、PostgreSQL 9.2からは、インデックオンリースキャン機能でインデックスで定義されたカラムのデータのみの取得の場合、テーブル本体データを取得せずに結果が返せるようになりました。
ex)SELECT x, y FROM tab WHERE x = 'key'; (x,yがインデックス)
また、テーブルによっては、SELECT * FROM Table ;のようにWHEREで条件指定しないものもあるのですが、その場合はインデックスをつくらないほうが適切でしょうか?
常にORDER BYもせずに全件検索を行うテーブルで有ればインデクスは必要無いと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/10 04:01