6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windows版PostgreSQLの拡張機能 pg_dbms_stats をビルドする

6
Posted at

はじめに

この記事は PostgreSQL Advent Calendar 2025 の24日目です。

PostgreSQLの拡張機能pg_dbms_statsは、ANALYZE が収集する統計情報を管理するためのツールです。ところがLinux版と違い、Windows版は公式にビルドしたものをリリースしていません。

別件のトラブルでpg_statsinfoについて調べていると、Windows版のpg_repackバイナリ配布しているという記事を見つけました。

SRA OSSとしてPostgreSQL拡張のWindowsバイナリ提供を開始しているが、今のところはサポート加入者のみで、一般配布は計画中とのこと。

SRA OSSで継続バイナリリリース

※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)を選択します。
image.png
pg_dbms_stats でプロジェクトを作成します。

image.png

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

ファイルの追加の既存ファイル削除

上位フォルダから「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検索したものをセットしています。

pg_dbms_stats.def
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年の記事を参考にしているため、もう改善されている可能性があります。

image.png

C/C++の例外を無効化

C/C++の「コード生成」を選択、「C/C++の例外を有効にする」で「いいえ」にします。
image.png

コンパイルをC言語へ

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

  • 4703…未使用要素
  • 4996…非推奨関数

4996の非推奨関数の警告を無視したくない場合、#define _CRT_SECURE_NO_WARNINGSの指定やstrcpyの代わりにstrcpy_sへ書き換える方法もあります。

プリコンパイル済みヘッダーを使用しない

C/C++の「プリコンパイル済みヘッダー」を選択、「プリコンパイル済みヘッダー」で「プリコンパイル済みヘッダーを使用しない」にします。
image.png

マニフェストを生成しない

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

追加の依存関係

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

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

モジュール定義関係

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

インクルードディレクトリ

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

  • include¥server¥port¥win32_msvc
  • include¥server¥port¥win32
  • include¥server
  • include

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

ライブラリディレクトリ

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

image.png

プロジェクトの構築

プルダウンメニューから「Relese」を選択します。
image.png

プログラム

構成

image.png

msvcフォルダの中身、x64¥Releseフォルダに「pg_dbms_stats.dll」ファイルが生成される。
image.png

導入

配置

今回の筆者の場合、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の事前ロード用の設定を追加します。

postgres.conf
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の拡張機能もサポートがもっと充実するようになればいいのにな。

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?