はじめに
この記事は PostgreSQL Advent Calendar 2025 の24日目です。
PostgreSQLの拡張機能pg_dbms_statsは、ANALYZE が収集する統計情報を管理するためのツールです。ところがLinux版と違い、Windows版は公式にビルドしたものをリリースしていません。
別件のトラブルでpg_statsinfoについて調べていると、Windows版のpg_repackバイナリ配布しているという記事を見つけました。
SRA OSSとしてPostgreSQL拡張のWindowsバイナリ提供を開始しているが、今のところはサポート加入者のみで、一般配布は計画中とのこと。
SRA OSSで継続バイナリリリース
- pg_hint_plan 対応済
- pgaudit 対応済
- pg_repack 対応済
- pg_dbms_stats
※2025年12月時点ではまだ一般配布は行われていません。
じゃー自力でなんとかしてみようと考えたところです。
pg_repackを攻略してから急にやる気を失ったのですが、残り1つ何とかやり切ります。
環境
- Windos 11 Home 64bit
- Visual Studio 2022(C++ によるデスクトップ開発) インストール済み
- PostgreSQL 14.7
- pg_dbms_stats 14.0 (2025/12/23時点の最新版)
仕事の関係上、現時点では少し古めの PostgreSQL のバージョンを使用します。
PostgreSQL 14は、2021/09/30リリース
PostgreSQL 14のインストール先は、PC入替えにより前記事と違いCドライブ直下です。
開発準備
pg_dbms_statsをビルドする上で今回 Visual Studio を使用します。
プロジェクトファイルを Github に置きました。
ただし、pg_dbms_statsのソースコードやpg_dbms_stats.dllは含まれていません
pg_dbms_stats を取得
下記サイトから Source code(zip) を取得します。
筆者は、C:¥WorkSpace に展開しました。
プロジェクト作成
C++でダイナミックリンクライブラリ(DLL)を選択します。

pg_dbms_stats でプロジェクトを作成します。
プロジェクトを一旦閉じます。
同じ拡張機能のpg_repackに倣って、pg_dbms_statsフォルダからmsvcに変更したらプロジェクトを開き直します。

ファイルの追加の既存ファイル削除
上位フォルダから「pg_dbms_stats.c」、「dump.c」、「import.c」、「pg_dbms_stats.h」ファイルをソースファイルに追加します。
あと、既存ファイルの下記ファイルは不要なので削除します。
- dllmain.cpp
- pch.cpp
- framework.h
- pch.h
定義ファイルの作成
モジュール定義ファイル(.def)を作成して、msvcフォルダに配置します。
extern DatumでGrep検索したものをセットしています。
LIBRARY pg_dbms_stats
EXPORTS
_PG_init
_PG_fini
dbms_stats_array_recv
dbms_stats_import
dbms_stats_merge
dbms_stats_invalidate_relation_cache
dbms_stats_invalidate_column_cache
dbms_stats_is_system_schema
dbms_stats_is_system_catalog
dbms_stats_anyary_anyary
dbms_stats_type_is_analyzable
dbms_stats_anyarray_basetype
プロパティ設定
pg_dbms_statsでプロジェクトのプロパティにて、構成を「すべての構成」にします。
プリプロセッサ定義
C/C++の「プリプロセッサ」を選択、「プリプロセッサの定義」に「WIN32」を追加します。
PostgreSQLは「WINDLL」を同等のものとして認識しないため、Win32プラットフォームの場合は明示的に指定する必要があります。
※2014年の記事を参考にしているため、もう改善されている可能性があります。
C/C++の例外を無効化
C/C++の「コード生成」を選択、「C/C++の例外を有効にする」で「いいえ」にします。

コンパイルをC言語へ
C/C++の「詳細設定」を選択、「コンパイル言語の選択」で「C コードとしてコンパイル(/TC)」にします。
次に「指定の警告を無視する」を「4703;4996」をセットします。

- 4703…未使用要素
- 4996…非推奨関数
4996の非推奨関数の警告を無視したくない場合、#define _CRT_SECURE_NO_WARNINGSの指定やstrcpyの代わりにstrcpy_sへ書き換える方法もあります。
プリコンパイル済みヘッダーを使用しない
C/C++の「プリコンパイル済みヘッダー」を選択、「プリコンパイル済みヘッダー」で「プリコンパイル済みヘッダーを使用しない」にします。

マニフェストを生成しない
リンカーの「マニフェスト ファイル」を選択、「マニフェストの生成」で「いいえ (/MANIFEST:NO)」にします。

追加の依存関係
リンカーの「入力」を選択、「追加の依存ファイル」に「postgres.lib」を追加します。

「親またはプロジェクトの既定値から継承」のチェックは外さないでください。
単純な拡張機能では必要ありませんが、サーバー関数にリンクする場合は必要になります。

モジュール定義関係
モジュール定義ファイル「pg_dbms_stats.def」をセットします。

インクルードディレクトリ
C/C++の「全般」を選択、「追加のインクルードディレクトリ」で、PostgreSQLインストール配下の4つのフォルダを追加します。
- include¥server¥port¥win32_msvc
- include¥server¥port¥win32
- include¥server
- include

今回の筆者の場合、PostgreSQLインストールフォルダは「C:¥PostgreSQL¥14」になります。

ライブラリディレクトリ
リンカーの「全般」を選択、「追加のライブラリ ディレクトリ」で、PostgreSQLインストール配下のlibフォルダを追加します。
次に「ライブラリ依存関係のリンク」を「いいえ」にします。

プロジェクトの構築
プログラム
構成
msvcフォルダの中身、x64¥Releseフォルダに「pg_dbms_stats.dll」ファイルが生成される。

導入
配置
今回の筆者の場合、PostgreSQLインストールフォルダは「C:¥PostgreSQL¥14」になりますので、下記に配置します。
| ファイル | 配置先 |
|---|---|
| pg_dbms_stats.dll | lib |
| pg_dbms_stats.control | share\extension |
| pg_dbms_stats--14.0.sql | 同上 |
postgres.confの修正
設定ファイルにpg_dbms_statsの事前ロード用の設定を追加します。
shared_preload_libraries = 'pg_dbms_stats'
ファイル編集後、PostgreSQLサーバを起動、または再起動してください。
※shared_preload_librariesには、カンマ区切りで複数のモジュールが登録できます。
PostgreSQLに拡張機能の登録
CREATE EXTENSION pg_dbms_stats;
登録の確認
SELECT extname, extversion
FROM pg_extension
WHERE extname = 'pg_dbms_stats';
| extname | extversion |
|---|---|
| pg_dbms_stats | 14.0 |
検証
下記サイトを参考に後日検証します。
最後に
PostgreSQLの世界では、Windows版はマイナーだとpg_repackの時に思い知った。
https://github.com/reorg/pg_repack/issues/461
本当は、SRA OSSで一般配布をして頂けるのがいいですけどね。
Windows版PostgreSQLの拡張機能もサポートがもっと充実するようになればいいのにな。




