1. ホーム
  2. sql

[解決済み] PostgreSQLのインデックス使用状況分析

2023-01-25 13:54:15

質問

Postgres を分析し、どのインデックスを作成すべきか、どの未使用のインデックスを削除すべきかを判断するツールまたは方法はありますか? 私は SQLServer 用の "profiler" ツールでこれを行う経験が少しありますが、Postgres に含まれる同様のツールは知りません。

どのように解決するのですか?

欠落しているインデックスを見つけるために、このような方法があります。

SELECT
  relname                                               AS TableName,
  to_char(seq_scan, '999,999,999,999')                  AS TotalSeqScan,
  to_char(idx_scan, '999,999,999,999')                  AS TotalIndexScan,
  to_char(n_live_tup, '999,999,999,999')                AS TableRows,
  pg_size_pretty(pg_relation_size(relname :: regclass)) AS TableSize
FROM pg_stat_all_tables
WHERE schemaname = 'public'
      AND 50 * seq_scan > idx_scan -- more than 2%
      AND n_live_tup > 10000
      AND pg_relation_size(relname :: regclass) > 5000000
ORDER BY relname ASC;

これは、インデックススキャンよりもシーケンススキャンの方が多いかどうかをチェックします。Postgresはテーブルに対してシーケンススキャンを好むようですので、テーブルが小さい場合、それは無視されます。

上記のクエリはインデックスがないことを明らかにします。

次のステップは、欠落している結合インデックスを検出することです。これは簡単ではありませんが、実行可能です。遅いクエリを分析するとか......。私は pg_stat_statements が役立つと聞いたのですが...