統計情報
PostgreSQLは 統計情報が非常に充実しているため、性能対策に活かすことができる。
統計情報を活用すべきです!
以下に具体例をお伝えします。
不要なINDEX その1
INDEXは 検索を速くするための仕組みだが、検索を速くするため、
本の索引と同様、データが登録される度に 索引の項目で並び替えているため、
検索以外の処理が遅くなる。
以下に、INDEXスキャンされた累計回数が記録されているため、
Primary Key以外のINDEXで、0のINDEXを削除する。
pg_stat_user_indexes.idx_scan
Primary KeyのINDEXは、スキャン回数が0回でも
他に役割があるため、削除してはいけない。
Primary Keyの項目は、以下で確認可能。もしくは設計書。
table_constraints.constraint_type が 'PRIMARY KEY'
table_constraints.constraint_name を constraint_column_usage.constraint_name と結合し、
得られる constraint_column_usage.column_name
INDEXの項目は 以下で確認可能。
pg_indexes.indexdef
不要なINDEX その2
不要なINDEXは もう1つある。
私の経験上 結構あるが、意外に知られていない。
項目AがPrimary Keyだった場合、項目Aと項目Bを持ったINDEX。
項目AはUnique Keyのため、項目Aで検索した際、既にデータは1件に絞られている。
※もしくは0件
そのため、これ以上 項目Bで検索する必要がない。
項目数が多いため、INDEXのサイズが大きくなってしまい、
この余分なINDEXがあることによって、
・検索以外の処理が遅くなる
・検索処理が遅くなる(INDEXのサイズが大きくなるため)
他にもありますが、今回はINDEXについてお伝えしました。
INDEX以外につきましては、次回お伝えします。
この辺りの話は、以下のブログにまとめておりますので、是非参考にしてみて下さい。
PostgreSQL 纏め
https://chakugan.hatenablog.com/entry/2021/12/31/140837
補足(より深く学びたい方へ)
今回のような「性能問題の原因分析」や、
実務での運用・チューニング手順について、講座で体系的に解説しています。
https://www.udemy.com/course/postgresql-sql/?referralCode=64B372729B6BC0073ACB