着眼点の構想

読書、音楽、お酒 などについて、語っていきます。

PostgreSQLにおける統計情報固定化の問題点

仕事でPostgreSQL9.6 を使っているので、
PostgreSQLについて、書いていきます。

PostgreSQLは 統計情報を固定化することができる。

統計情報の固定化の機能を利用しようとすると、
dbms_statsというスキーマが作成され、その配下に
relation_stats_locked
column_stats_locked
等のテーブルが作成される。

それらに、統計情報が書き込まれる。


PostgreSQLは、ORACLEと違い、
テーブルやINDEXのオブジェクトを IDで管理している。

ORACLEではディクショナリ、
PostgreSQLではシステムカタログと呼ばれる、
システムで管理している情報がある。

ORACLEの場合、名称で管理している。

PostgreSQLは63バイトまで定義できるから、かもしれないが、
名前ではなく、システムで割り振ったIDで管理している。

ORACLEは、TABLESPACEがOS上のファイルになっており、
そのファイルの中は、ORACLEが管理している。

PostgreSQLは、TABLESPACEがOS上のディレクトリになっており、
ディレクトリ配下に、数字が付いたファイルが作成される。

この数字が各オブジェクトに割り振られたIDである。


統計情報を固定化すると、
上記のテーブルにオブジェクトIDも保持される。


と、ここまでは良い。


INDEXは、使用していると肥大化していくため、
再構築が必要になる。

PostgreSQLのINDEXの再構築には、
REINDEX
CREATE INDEX CONCURRENTRY
の2つあるが、
REINDEXはロックがかかってしまう。

夜間等、システムを使用していない時間帯があれば問題ないが、
そのような時間が無い場合、
CREATE INDEX CONCURRENTRY
を使用することになる。


CREATE INDEX CONCURRENTRY
を行うと、INDEXのIDが変わってしまう。


そのため、以下の双方を行うことができない。
・統計情報の固定化
・CREATE INDEX CONCURRENTRYによるINDEXの再構築