PostgreSQLとは
PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システム(ORDBMS)です。単なるリレーショナルデータベースにとどまらず、オブジェクト指向の設計思想を取り入れており、データベース内部の構造をより柔軟かつ拡張性高く構築できます。
PostgreSQLの特徴
- オープンソース
- 豊富なデータ型(JSON、幾何データ型、ユーザ定義型など)
- SQL標準への高い準拠
- 拡張性(多数の拡張モジュール)
PostgreSQLの設計思想:オブジェクト指向
PostgreSQLはオブジェクト指向の設計原則に従って構築されています。主な特徴は以下の通りです:
- 一意性:各オブジェクトはoidという一意な識別子を持ちます。
- 抽象性:pg_classなどのカタログテーブルがクラスに相当します。
- 継承性:テーブルパーティショニングが継承を用いて実装されています。
- 多態性:anyelementやanyarrayなどの多態型がサポートされています。
pg_class:データベースのクラス情報を管理するカタログテーブル
pg_classは、テーブル、インデックス、ビュー、シーケンス、TOASTテーブルなどのデータベースオブジェクトに関する情報を保持するシステムカタログです。
pg_classの主なカラム
| カラム名 | 説明 |
|---|---|
| oid | オブジェクトの一意な識別子 |
| relname | オブジェクト名 |
| relkind | オブジェクトの種類(r=通常テーブル、i=インデックス、S=シーケンス、v=ビュー、m=マテリアライズドビューなど) |
| relowner | 所有者のoid |
| relpages | オブジェクトが占めるページ数(1ページは通常8KB) |
pg_classの利用例
-- 全てのオブジェクトを表示
SELECT oid, relname, relkind FROM pg_class;
-- ビューの一覧を取得
SELECT * FROM pg_class WHERE relkind = 'v';
-- シーケンスの一覧を取得
SELECT * FROM pg_class WHERE relkind = 'S';
-- 特定のテーブル情報を検索
SELECT * FROM pg_class WHERE relname LIKE '%user%';
オブジェクトのサイズを確認する例
-- テーブルの合計サイズを取得
SELECT pg_size_pretty(pg_total_relation_size(oid)) AS total_size FROM pg_class WHERE relname = 'users';
-- 指定したoidのテーブルサイズを取得
SELECT pg_size_pretty(pg_total_relation_size(16384)) AS total_size;
pg_proc:関数情報を管理するカタログテーブル
pg_procは、関数、プロシージャ、集約関数、ウィンドウ関数などのメタ情報を格納するシステムカタログです。
pg_procの主なカラム
| カラム名 | 説明 |
|---|---|
| oid | 関数の一意な識別子 |
| proname | 関数名 |
| prosrc | 関数の定義内容 |
| prokind | 関数の種類(f=通常関数、p=プロシージャ、a=集約関数、w=ウィンドウ関数) |
pg_procの利用例
-- 特定の関数を検索
SELECT proname, prosrc FROM pg_proc WHERE proname = 'calculate_score';
-- 指定したテーブルに関連する関数を検索
SELECT * FROM pg_proc WHERE prosrc LIKE '%user_table%';
PostgreSQLの拡張機能
PostgreSQLの拡張機能は、データベースの柔軟性と機能性を高める重要な要素です。以下は代表的な拡張機能の例です:
-- インストール可能な拡張機能の一覧を取得
SELECT * FROM pg_available_extensions;
-- 既にインストールされている拡張機能を取得
SELECT * FROM pg_available_extensions WHERE installed_version IS NOT NULL;
推奨される拡張機能
- pg_stat_statement:SQL文の実行統計情報を追跡します。
- pg_repack:ロックを最小限に抑えながらテーブルを再構成します。
まとめ
PostgreSQLは単なるリレーショナルデータベースではなく、オブジェクト指向の設計思想に基づいた柔軟で拡張性の高いシステムです。pg_classやpg_procといったカタログテーブルを活用することで、データベース内部の構造やメタ情報を深く理解し、効率的に運用することが可能です。