© 2021 NTT DATA Corporation PostgreSQLの統計情報について 2021年8月24日 第26回PostgreSQLアンカンファレンス@オンライン 株式会社NTTデータ 清野 裕貴
2 © 2021 NTT DATA Corporation 本講演について 講演資料は、NTTデータのSlideShareアカウント上で公開予定です。 https://www.slideshare.net/nttdata-tech
3 © 2021 NTT DATA Corporation 自己紹介 清野 裕貴 @NTTデータ 現在(2020.07~) PostgreSQL研究開発、社内普及展開 これまで(~2020.06) 公共系プロジェクトのPM/AP要件定義・設計の業務に従事 ※使用していたRDBMSはOracle Database 11g,12c @YukiSeino
4 © 2021 NTT DATA Corporation 本日の説明内容 本日は、PostgreSQL統計情報の内部構造を説明します! (一般的な統計情報関連のキーワードを理解している前提で進めます。[統計情報コレクタ、実行計画等]) 私自身が統計情報を理解していく上で躓いたポイントを中心に説明しますので、 既にPostgreSQL内部構造・統計情報への理解がプロフェッショナルな方には、 物足りない内容となってしまうこと、ご容赦ください!!
5 © 2021 NTT DATA Corporation PostgreSQLの統計情報について PostgreSQLの統計情報について何となく理解できたが、理解が断片的で不安。。。 統計情報 統計情報コレクタ 稼働統計情報 プランナ 実行計画 動的統計情報ビュー 収集済み統計情報ビュー PostgreSQLで扱う統計情報を一枚絵にしてみました。 ⇒感想:自分なりに各キーワードの位置づけが整理できました アナライズ pg_stat_*** pg_class pg_statistic
6 © 2021 NTT DATA Corporation PostgreSQLの統計情報について 各サーバプロセス stats collector (統計情報コレクタ) SQL操作 postgres (バックエンドプロセス) ・ 収集済み統計情報ビュー ・ 動的統計情報ビュー =# SELECT * FROM pg_stat_*** VACUUM その他 ① 統計情報コレクタにレポート (ローカルメモリを更新) ②ー2 統計情報コレクタがローカルメモリ の内容をファイルへ更新 ②ー3 更新された統計 情報を取得 /data/pg_stat_tmp ②ー1 統計情報コレクタに参照要求(ファイル書き込みを要求) =# ANALYZE ; autovacuum worker ANALYZE VACUUM システムカタログ (pg_class, pg_statistic…) postgres (バックエンドプロセス) ①ー2 手動ANALYZEによる 統計情報更新 ①ー1 自動ANALYZEによる 統計情報更新 クライアント パーサ アナライザ リライタ プランナ =# SELECT * FROM hoge WHERE … ; postgres (バックエンドプロセス) ② 統計 情報 利用 エグゼキュータ 実行計画で使用される統計情報 ユーザーに提供する統計情報 共有メモリ ③ー1 共有メモリの 情報を更新 ③ー2 共有メモリから 情報を取得 (一部のビュー) 稼働統計情報 [ファイル] (global.stat, db_{OID}.stat) 稼働統計情報 [ローカルメモリ]
7 © 2021 NTT DATA Corporation PostgreSQLの統計情報について 実行計画で使用される統計情報(システムカタログ) ① ANALYZE等によりシステムカタログを更新 ② SQL実行時にプランナがシステムカタログ から統計情報を取得 =# ANALYZE ; autovacuum worker ANALYZE VACUUM システムカタログ (pg_class, pg_statistic…) postgres (バックエンドプロセス) ①ー2 手動ANALYZEによる 統計情報更新 ①ー1 自動ANALYZEによる 統計情報更新 クライアント パーサ アナライザ リライタ プランナ = SELECT * FROM hoge WHERE … ; postgres (バックエンドプロセス) ② 統計 情報 利用 エグゼキュータ
8 © 2021 NTT DATA Corporation PostgreSQLの統計情報について 実行計画で使用される統計情報(システムカタログ) プランナはANALYZEにより更新された「統計情報:システムカタログ」を使用して、実行計画を作成する。 ① ANALYZE等によりシステムカタログを更新 ② SQL実行時にプランナがシステムカタログ から統計情報を取得 =# ANALYZE ; autovacuum worker ANALYZE VACUUM システムカタログ (pg_class, pg_statistic…) postgres (バックエンドプロセス) ①ー2 手動ANALYZEによる 統計情報更新 ①ー1 自動ANALYZEによる 統計情報更新 クライアント パーサ アナライザ リライタ プランナ =# SELECT * FROM hoge WHERE … ; postgres (バックエンドプロセス) ② 統計 情報 利用 エグゼキュータ システムカタログの更新契機はANALYZEだけでなく、VACUUM や一部DDLコマンドでも更新されます。 プランナはシステムカタログだ けでなく、対象テーブルのサ イズ等も取得します
9 © 2021 NTT DATA Corporation PostgreSQLの統計情報について ユーザーに提供する統計情報(稼働統計情報) ① 各データベース操作により統計情報コレクタの ローカルメモリ内容を更新 ②③ 統計情報ビュー(関数)による統計情報参照 各サーバプロセス stats collector (統計情報コレクタ) SQL操作 postgres (バックエンドプロセス) ・ 収集済み統計情報ビュー ・ 動的統計情報ビュー =# SELECT * FROM pg_stat_*** VACUUM その他 ① 統計情報コレクタにレポート (ローカルメモリを更新) ②ー2 統計情報コレクタがローカルメモリ の内容をファイルへ更新 ②ー3 更新された統計 情報を取得 /data/pg_stat_tmp ②ー1 統計情報コレクタに参照要求(ファイル書き込みを要求) 稼働統計情報 [ファイル] (global.stat, db_{OID}.stat) 稼働統計情報 [ローカルメモリ]
10 © 2021 NTT DATA Corporation PostgreSQLの統計情報について ユーザーに提供する統計情報(稼働統計情報) PostgreSQL利用者は統計情報コレクタにより更新された「統計情報:稼働統計情報」を確認する ① 各データベース操作により統計情報コレクタの ローカルメモリ内容を更新 ②③ 統計情報ビュー(関数)による統計情報参照 一部のビュー(pg_stat_activity)は稼働統計情報(ファイル)ではなく、共有メモリを参照する。 (統計情報コレクタを介せず、バックエンドプロセスが直接、共有メモリ内容を更新・取得する。) 稼働統計情報(テーブルの更新・挿入・削除の情報)は autovacuum(VACUUM, ANALYZE)実行のトリガ情報としても使用される。 ※間接的に実行計画で使用される統計情報(システムカタログ)に関係してくる。 各サーバプロセス stats collector (統計情報コレクタ) SQL操作 postgres (バックエンドプロセス) ・ 収集済み統計情報ビュー ・ 動的統計情報ビュー =# SELECT * FROM pg_stat_*** VACUUM その他 ① 統計情報コレクタにレポート (ローカルメモリを更新) ②ー2 統計情報コレクタがローカルメモリ の内容をファイルへ更新 ②ー3 更新された統計 情報を取得 /data/pg_stat_tmp ②ー1 統計情報コレクタに参照要求(ファイル書き込みを要求) 共有メモリ ③ー1 共有メモリの 情報を更新 ③ー2 共有メモリから 情報を取得 (一部のビュー) 稼働統計情報 [ファイル] (global.stat, db_{OID}.stat) 稼働統計情報 [ローカルメモリ]
11 © 2021 NTT DATA Corporation PostgreSQLの統計情報について 各サーバプロセス stats collector (統計情報コレクタ) SQL操作 postgres (バックエンドプロセス) ・ 収集済み統計情報ビュー ・ 動的統計情報ビュー =# SELECT * FROM pg_stat_*** 稼働統計情報 [ファイル] (global.stat, db_{OID}.stat) VACUUM その他 ① 統計情報コレクタにレポート (ローカルメモリを更新) ②ー2 統計情報コレクタがローカルメモリ の内容をファイルへ更新 ②ー3 更新された統計 情報を取得 /data/pg_stat_tmp ②ー1 統計情報コレクタに参照要求(ファイル書き込みを要求) 稼働統計情報 [ローカルメモリ] =# ANALYZE ; autovacuum worker ANALYZE VACUUM システムカタログ (pg_class, pg_statistic…) postgres (バックエンドプロセス) ①ー2 手動ANALYZEによる 統計情報更新 ①ー1 自動ANALYZEによる 統計情報更新 クライアント パーサ アナライザ リライタ プランナ =# SELECT * FROM hoge WHERE … ; postgres (バックエンドプロセス) ② 統計 情報 利用 エグゼキュータ 実行計画で使用される統計情報 ユーザーに提供する統計情報 共有メモリ ③ー1 共有メモリの 情報を更新 ③ー2 共有メモリから 情報を取得 (一部のビュー)
12 © 2021 NTT DATA Corporation PostgreSQLの統計情報について 各サーバプロセス stats collector (統計情報コレクタ) SQL操作 postgres (バックエンドプロセス) ・ 収集済み統計情報ビュー ・ 動的統計情報ビュー =# SELECT * FROM pg_stat_*** VACUUM その他 ① 統計情報コレクタにレポート (ローカルメモリを更新) ②ー2 統計情報コレクタがローカルメモリ の内容をファイルへ更新 ②ー3 更新された統計 情報を取得 /data/pg_stat_tmp ②ー1 統計情報コレクタに参照要求(ファイル書き込みを要求) =# ANALYZE ; autovacuum worker ANALYZE VACUUM システムカタログ (pg_class, pg_statistic…) postgres (バックエンドプロセス) ①ー2 手動ANALYZEによる 統計情報更新 ①ー1 自動ANALYZEによる 統計情報更新 クライアント パーサ アナライザ リライタ プランナ =# SELECT * FROM hoge WHERE … ; postgres (バックエンドプロセス) ② 統計 情報 利用 エグゼキュータ 実行計画で使用される統計情報 ユーザーに提供する統計情報 共有メモリ ③ー1 共有メモリの 情報を更新 ③ー2 共有メモリから 情報を取得 (一部のビュー) 稼働統計情報 [ファイル] (global.stat, db_{OID}.stat) 稼働統計情報 [ローカルメモリ] 大事なポイント PostgreSQLで扱う統計情報は、以下に2つに分類される。 A. 実行計画で使用される統計情報(システムカタログ) B. ユーザーに提供する統計情報(統計情報コレクタによる稼働統計情報)
13 © 2021 NTT DATA Corporation さいごに • PostgreSQLの統計情報の内部構造について、私主観の疑問の解消過程を紹介しました。 • 同じような疑問を持っていた方の一助になれば幸いです。 • 共有メモリベースの統計情報コレクタについて、コミュニティでディスカッションが行われているので、 キャッチアップが進んだら、次回以降のアンカンファレンスで紹介できればと思います。
© 2021 NTT DATA Corporation 14 YouTubeチャンネル “NTT DATA Tech” 技術取り組み、活用情報を中心にお届けします https://www.youtube.com/NTTDATATech
© 2021 NTT DATA Corporation その他、記載されている会社名、商品名、又はサービス名は、 各社の登録商標又は商標です。

PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)

  • 1.
    © 2021 NTTDATA Corporation PostgreSQLの統計情報について 2021年8月24日 第26回PostgreSQLアンカンファレンス@オンライン 株式会社NTTデータ 清野 裕貴
  • 2.
    2 © 2021 NTTDATA Corporation 本講演について 講演資料は、NTTデータのSlideShareアカウント上で公開予定です。 https://www.slideshare.net/nttdata-tech
  • 3.
    3 © 2021 NTTDATA Corporation 自己紹介 清野 裕貴 @NTTデータ 現在(2020.07~) PostgreSQL研究開発、社内普及展開 これまで(~2020.06) 公共系プロジェクトのPM/AP要件定義・設計の業務に従事 ※使用していたRDBMSはOracle Database 11g,12c @YukiSeino
  • 4.
    4 © 2021 NTTDATA Corporation 本日の説明内容 本日は、PostgreSQL統計情報の内部構造を説明します! (一般的な統計情報関連のキーワードを理解している前提で進めます。[統計情報コレクタ、実行計画等]) 私自身が統計情報を理解していく上で躓いたポイントを中心に説明しますので、 既にPostgreSQL内部構造・統計情報への理解がプロフェッショナルな方には、 物足りない内容となってしまうこと、ご容赦ください!!
  • 5.
    5 © 2021 NTTDATA Corporation PostgreSQLの統計情報について PostgreSQLの統計情報について何となく理解できたが、理解が断片的で不安。。。 統計情報 統計情報コレクタ 稼働統計情報 プランナ 実行計画 動的統計情報ビュー 収集済み統計情報ビュー PostgreSQLで扱う統計情報を一枚絵にしてみました。 ⇒感想:自分なりに各キーワードの位置づけが整理できました アナライズ pg_stat_*** pg_class pg_statistic
  • 6.
    6 © 2021 NTTDATA Corporation PostgreSQLの統計情報について 各サーバプロセス stats collector (統計情報コレクタ) SQL操作 postgres (バックエンドプロセス) ・ 収集済み統計情報ビュー ・ 動的統計情報ビュー =# SELECT * FROM pg_stat_*** VACUUM その他 ① 統計情報コレクタにレポート (ローカルメモリを更新) ②ー2 統計情報コレクタがローカルメモリ の内容をファイルへ更新 ②ー3 更新された統計 情報を取得 /data/pg_stat_tmp ②ー1 統計情報コレクタに参照要求(ファイル書き込みを要求) =# ANALYZE ; autovacuum worker ANALYZE VACUUM システムカタログ (pg_class, pg_statistic…) postgres (バックエンドプロセス) ①ー2 手動ANALYZEによる 統計情報更新 ①ー1 自動ANALYZEによる 統計情報更新 クライアント パーサ アナライザ リライタ プランナ =# SELECT * FROM hoge WHERE … ; postgres (バックエンドプロセス) ② 統計 情報 利用 エグゼキュータ 実行計画で使用される統計情報 ユーザーに提供する統計情報 共有メモリ ③ー1 共有メモリの 情報を更新 ③ー2 共有メモリから 情報を取得 (一部のビュー) 稼働統計情報 [ファイル] (global.stat, db_{OID}.stat) 稼働統計情報 [ローカルメモリ]
  • 7.
    7 © 2021 NTTDATA Corporation PostgreSQLの統計情報について 実行計画で使用される統計情報(システムカタログ) ① ANALYZE等によりシステムカタログを更新 ② SQL実行時にプランナがシステムカタログ から統計情報を取得 =# ANALYZE ; autovacuum worker ANALYZE VACUUM システムカタログ (pg_class, pg_statistic…) postgres (バックエンドプロセス) ①ー2 手動ANALYZEによる 統計情報更新 ①ー1 自動ANALYZEによる 統計情報更新 クライアント パーサ アナライザ リライタ プランナ = SELECT * FROM hoge WHERE … ; postgres (バックエンドプロセス) ② 統計 情報 利用 エグゼキュータ
  • 8.
    8 © 2021 NTTDATA Corporation PostgreSQLの統計情報について 実行計画で使用される統計情報(システムカタログ) プランナはANALYZEにより更新された「統計情報:システムカタログ」を使用して、実行計画を作成する。 ① ANALYZE等によりシステムカタログを更新 ② SQL実行時にプランナがシステムカタログ から統計情報を取得 =# ANALYZE ; autovacuum worker ANALYZE VACUUM システムカタログ (pg_class, pg_statistic…) postgres (バックエンドプロセス) ①ー2 手動ANALYZEによる 統計情報更新 ①ー1 自動ANALYZEによる 統計情報更新 クライアント パーサ アナライザ リライタ プランナ =# SELECT * FROM hoge WHERE … ; postgres (バックエンドプロセス) ② 統計 情報 利用 エグゼキュータ システムカタログの更新契機はANALYZEだけでなく、VACUUM や一部DDLコマンドでも更新されます。 プランナはシステムカタログだ けでなく、対象テーブルのサ イズ等も取得します
  • 9.
    9 © 2021 NTTDATA Corporation PostgreSQLの統計情報について ユーザーに提供する統計情報(稼働統計情報) ① 各データベース操作により統計情報コレクタの ローカルメモリ内容を更新 ②③ 統計情報ビュー(関数)による統計情報参照 各サーバプロセス stats collector (統計情報コレクタ) SQL操作 postgres (バックエンドプロセス) ・ 収集済み統計情報ビュー ・ 動的統計情報ビュー =# SELECT * FROM pg_stat_*** VACUUM その他 ① 統計情報コレクタにレポート (ローカルメモリを更新) ②ー2 統計情報コレクタがローカルメモリ の内容をファイルへ更新 ②ー3 更新された統計 情報を取得 /data/pg_stat_tmp ②ー1 統計情報コレクタに参照要求(ファイル書き込みを要求) 稼働統計情報 [ファイル] (global.stat, db_{OID}.stat) 稼働統計情報 [ローカルメモリ]
  • 10.
    10 © 2021 NTTDATA Corporation PostgreSQLの統計情報について ユーザーに提供する統計情報(稼働統計情報) PostgreSQL利用者は統計情報コレクタにより更新された「統計情報:稼働統計情報」を確認する ① 各データベース操作により統計情報コレクタの ローカルメモリ内容を更新 ②③ 統計情報ビュー(関数)による統計情報参照 一部のビュー(pg_stat_activity)は稼働統計情報(ファイル)ではなく、共有メモリを参照する。 (統計情報コレクタを介せず、バックエンドプロセスが直接、共有メモリ内容を更新・取得する。) 稼働統計情報(テーブルの更新・挿入・削除の情報)は autovacuum(VACUUM, ANALYZE)実行のトリガ情報としても使用される。 ※間接的に実行計画で使用される統計情報(システムカタログ)に関係してくる。 各サーバプロセス stats collector (統計情報コレクタ) SQL操作 postgres (バックエンドプロセス) ・ 収集済み統計情報ビュー ・ 動的統計情報ビュー =# SELECT * FROM pg_stat_*** VACUUM その他 ① 統計情報コレクタにレポート (ローカルメモリを更新) ②ー2 統計情報コレクタがローカルメモリ の内容をファイルへ更新 ②ー3 更新された統計 情報を取得 /data/pg_stat_tmp ②ー1 統計情報コレクタに参照要求(ファイル書き込みを要求) 共有メモリ ③ー1 共有メモリの 情報を更新 ③ー2 共有メモリから 情報を取得 (一部のビュー) 稼働統計情報 [ファイル] (global.stat, db_{OID}.stat) 稼働統計情報 [ローカルメモリ]
  • 11.
    11 © 2021 NTTDATA Corporation PostgreSQLの統計情報について 各サーバプロセス stats collector (統計情報コレクタ) SQL操作 postgres (バックエンドプロセス) ・ 収集済み統計情報ビュー ・ 動的統計情報ビュー =# SELECT * FROM pg_stat_*** 稼働統計情報 [ファイル] (global.stat, db_{OID}.stat) VACUUM その他 ① 統計情報コレクタにレポート (ローカルメモリを更新) ②ー2 統計情報コレクタがローカルメモリ の内容をファイルへ更新 ②ー3 更新された統計 情報を取得 /data/pg_stat_tmp ②ー1 統計情報コレクタに参照要求(ファイル書き込みを要求) 稼働統計情報 [ローカルメモリ] =# ANALYZE ; autovacuum worker ANALYZE VACUUM システムカタログ (pg_class, pg_statistic…) postgres (バックエンドプロセス) ①ー2 手動ANALYZEによる 統計情報更新 ①ー1 自動ANALYZEによる 統計情報更新 クライアント パーサ アナライザ リライタ プランナ =# SELECT * FROM hoge WHERE … ; postgres (バックエンドプロセス) ② 統計 情報 利用 エグゼキュータ 実行計画で使用される統計情報 ユーザーに提供する統計情報 共有メモリ ③ー1 共有メモリの 情報を更新 ③ー2 共有メモリから 情報を取得 (一部のビュー)
  • 12.
    12 © 2021 NTTDATA Corporation PostgreSQLの統計情報について 各サーバプロセス stats collector (統計情報コレクタ) SQL操作 postgres (バックエンドプロセス) ・ 収集済み統計情報ビュー ・ 動的統計情報ビュー =# SELECT * FROM pg_stat_*** VACUUM その他 ① 統計情報コレクタにレポート (ローカルメモリを更新) ②ー2 統計情報コレクタがローカルメモリ の内容をファイルへ更新 ②ー3 更新された統計 情報を取得 /data/pg_stat_tmp ②ー1 統計情報コレクタに参照要求(ファイル書き込みを要求) =# ANALYZE ; autovacuum worker ANALYZE VACUUM システムカタログ (pg_class, pg_statistic…) postgres (バックエンドプロセス) ①ー2 手動ANALYZEによる 統計情報更新 ①ー1 自動ANALYZEによる 統計情報更新 クライアント パーサ アナライザ リライタ プランナ =# SELECT * FROM hoge WHERE … ; postgres (バックエンドプロセス) ② 統計 情報 利用 エグゼキュータ 実行計画で使用される統計情報 ユーザーに提供する統計情報 共有メモリ ③ー1 共有メモリの 情報を更新 ③ー2 共有メモリから 情報を取得 (一部のビュー) 稼働統計情報 [ファイル] (global.stat, db_{OID}.stat) 稼働統計情報 [ローカルメモリ] 大事なポイント PostgreSQLで扱う統計情報は、以下に2つに分類される。 A. 実行計画で使用される統計情報(システムカタログ) B. ユーザーに提供する統計情報(統計情報コレクタによる稼働統計情報)
  • 13.
    13 © 2021 NTTDATA Corporation さいごに • PostgreSQLの統計情報の内部構造について、私主観の疑問の解消過程を紹介しました。 • 同じような疑問を持っていた方の一助になれば幸いです。 • 共有メモリベースの統計情報コレクタについて、コミュニティでディスカッションが行われているので、 キャッチアップが進んだら、次回以降のアンカンファレンスで紹介できればと思います。
  • 14.
    © 2021 NTTDATA Corporation 14 YouTubeチャンネル “NTT DATA Tech” 技術取り組み、活用情報を中心にお届けします https://www.youtube.com/NTTDATATech
  • 15.
    © 2021 NTTDATA Corporation その他、記載されている会社名、商品名、又はサービス名は、 各社の登録商標又は商標です。

Editor's Notes

  • #15 情報発信については、NTT DATA Tech という YouTubeチャンネルを開設しました。 10月に開催したNTTデータ テクノロジーカンファレンスの模様や 技術トピックの解説映像などを、順次公開していきます。 こちらもあわせてご覧ください。