Heroku Postgres での拡張機能、PostGIS、フルテキスト検索辞書
最終更新日 2024年05月31日(金)
Table of Contents
拡張機能では、機能の関連する部分 (データ型や関数など) をまとめてバンドルし、1 つのコマンドでデータベースにインストールすることができます。Heroku Postgres は、多くの Postgres 拡張機能のほか、拡張機能システムの一部としてバンドルされていないフルテキスト検索などの機能をサポートしています。PostGIS 空間データベース拡張機能も使用できます。この記事の次の拡張機能のみがサポートされており、Heroku Postgres にインストールできます。
サポートされている拡張機能の一覧については、データベースのクエリを実行してください。
$ echo 'show extwlist.extensions' | heroku pg:psql
extwlist.extensions
-----------------------------
...bloom,btree_gin,btree_gist,cube,dblink,dict_int...
拡張機能のインストール
いずれかのサポートされている拡張機能を作成するには、heroku pg:psql
でセッションを開き、適切な CREATE EXTENSION
コマンドを実行します。
$ heroku pg:psql DATABASE_URL -a example-app
--> Connecting to postgresql-octagonal-12345
psql (13.2, server 11.12 (Ubuntu 11.12-1.pgdg16.04+1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
example-app::DATABASE=> CREATE EXTENSION hstore;
CREATE EXTENSION
example-app::DATABASE=>
すべてのプランのすべての Heroku Postgres データベースで、拡張機能はデフォルトで public
スキーマにインストールされます。特定のスキーマに拡張機能をインストールするには、CREATE EXTENSION
コマンドを WITH SCHEMA
と共に実行します。
$ heroku pg:psql DATABASE_URL -a example-app
--> Connecting to postgresql-octagonal-12345
psql (13.2, server 11.12 (Ubuntu 11.12-1.pgdg16.04+1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
example-app::DATABASE=> CREATE EXTENSION hstore WITH SCHEMA schema_name;
CREATE EXTENSION
example-app::DATABASE=>
heroku_ext
スキーマに拡張機能をインストールする必要はなくなりました。
拡張機能のアップグレード
Heroku Postgres アドオンで拡張機能のアップグレードが有効になっているかどうかを確認するには、heroku pg:info
コマンドを実行して、Upgradable Extensions
行を確認します。この値が No
に設定されている場合、次の定期的なメンテナンス後に拡張機能がアップグレード可能になります。
=== DATABASE_URL
Plan: Standard 0
Status: Available
Data Size: 2.15 GB
Tables: 4
PG Version: 15.2
Connections: 32/120
Connection Pooling: Available
Credentials: 1
Fork/Follow: Available
Rollback: earliest from 2023-04-21 17:14 UTC
Created: 2023-04-17 19:06
Region: us
Data Encryption: In Use
Continuous Protection: On
Enhanced Certificates: Off
Upgradable Extensions: Yes
Maintenance: not required
Maintenance window: Mondays 17:30 to 21:30 UTC
Add-on: postgresql-trapezoidal-57207
拡張機能をアップグレードするには、heroku pg:psql
セッションで、アップグレードする拡張機能に対して、ALTER EXTENSION
コマンドを実行します。
$ heroku pg:psql DATABASE_URL -a example-app
--> Connecting to postgresql-octagonal-12345
psql (13.2, server 11.12 (Ubuntu 11.12-1.pgdg16.04+1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
example-app::DATABASE=> CREATE EXTENSION btree_gin VERSION '1.0';
CREATE EXTENSION
example-app::DATABASE=> ALTER EXTENSION btree_gin UPDATE to '1.1';
ALTER EXTENSION
example-app::DATABASE=>
拡張機能の削除
既存の拡張機能をデータベースから削除するには、heroku pg:psql
でセッションを開き、適切な DROP EXTENSION
コマンドを実行します。
$ heroku pg:psql DATABASE_URL -a example-app
--> Connecting to postgresql-octagonal-12345
psql (13.2, server 11.12 (Ubuntu 11.12-1.pgdg16.04+1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
example-app::DATABASE=> DROP EXTENSION hstore;
DROP EXTENSION
example-app::DATABASE=>
拡張機能の表示
拡張機能がインストールされているスキーマを確認するには、heroku pg:psql
でセッションを開き、\dx
コマンドを実行します。
intense-mesa-15917::DATABASE=> \dx
List of installed extensions
Name | Version | Schema | Description
--------------------+---------+------------+------------------------------------------------------------------------
pg_stat_statements | 1.10 | public | track planning and execution statistics of all SQL statements executed
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)
データ型
名前 | 説明 | コマンド |
---|---|---|
Bloom | 空間効率の高いブルームフィルターのインデックスを提供します | create extension bloom |
大文字と小文字を区別しないテキスト | 大文字と小文字が区別されないテキストデータ型。citext に保存された文字列は大文字小文字の情報を保持しますが、クエリで使用されるときは大文字と小文字が区別されません。 | create extension citext |
Cube | 多次元の立方体 | create extension cube |
HStore | Postgres 内のキー値ストア | create extension hstore |
Label Tree | 関数が関連付けられているツリー状の階層 | create extension ltree |
Large Objects | 特殊なラージオブジェクト構造に保存されているユーザーデータへのストリーム形式のアクセスを提供します | create extension lo |
Product Numbering | UPC、ISBN、ISSN などの製品 ID およびシリアル番号を保存します | create extension isn |
Seg | セグメントまたは浮動小数点区間を表すための型を提供します | create extension seg |
外部データラッパー
外部データラッパーは、Essential 層のデータベースでは使用できません。
名前 | 説明 | コマンド |
---|---|---|
postgres_fdw | Postgres データベースが外部サーバーとして別の Postgres データベースにアクセスできるようにします | create extension postgres_fdw |
関数
pg_partman と pg_prewarm は、Essential 層のデータベースでは使用できません。
名前 | 説明 | コマンド |
---|---|---|
Address Standardizer | 一連の定義されたルールに関するアドレスを正規化する 1 行のアドレスパーサー。US アドレスの一連のルールはすでに含まれています create extension address_standardizer_data_us |
create extension address_standardizer |
Autoinc | シーケンスの次の値を整数フィールドに保存します | create extension autoinc |
Earth Distance | 地球上の地点間の距離を計算するための関数 | create extension earthdistance |
Fuzzy Match | 文字列間の類似性を判定するための別の方法。UTF-8 のサポートは限定されています | create extension fuzzystrmatch |
Insert Username | 現在のユーザーの名前をテキストフィールドに挿入します | create extension insert_username |
Intarray | 整数の null のない配列のソート、操作、およびそのインデックスの作成を行います | create extension intarray |
ModDateTime | 現在のタイムスタンプをタイムスタンプフィールドに挿入します | create extension moddatetime |
PGCrypto | 暗号化関数によってデータベース内の暗号化が可能になります | create extension pgcrypto |
pg_partman | 時間ベースとシリアルベースの両方のテーブルパーティションセットを作成して管理します。サブパーティション分割もサポートされています | create extension pg_partman |
pg_prewarm | 新しく起動されるデータベースや休止データベースのパフォーマンスを正規化するために、オペレーティングシステムまたはデータベースバッファキャッシュにデータを事前ロードします | create extension pg_prewarm |
sslinfo | 接続しているクライアントに関する SSL 情報のクエリを実行するための関数を提供します | create extension sslinfo |
Table Functions & Pivot Tables | 完全なテーブルを返す関数。スプレッドシートのピボットテーブルと同様の方法でクエリ結果を操作する機能を含みます | create extension tablefunc |
tcn | リスナーにテーブルへの変更を通知するためのトリガー関数を提供します | create extension tcn |
Timetravel | 履歴データのクエリを実行するための関数を追加します | create extension timetravel |
Trigram | トライグラムの一致に基づいて、英数字の文字列の類似性 (または、それがないこと) を判定します。検索などの自然言語処理の問題に有効です | create extension pg_trgm |
tsm_system_rows | システム行を使用したテーブルサンプリングを提供します | create extension tsm_system_rows |
UUID Generation | データベース内の v1、v3、v4、v5 の UUID を生成します。既存の UUID データ型と適切に連携します | create extension uuid-ossp |
統計
名前 | 説明 | コマンド |
---|---|---|
pgrowlocks | テーブルの行ロックの情報を表示します | create extension pgrowlocks |
インデックスの種類
名前 | 説明 | コマンド |
---|---|---|
btree-gist | GiST インデックス演算子。これは一般に、B-tree では使用できない複数列インデックスや排他制約を除き、標準の B-tree インデックスより劣っています。 | create extension btree_gist |
btree-gin | GIN インデックス演算子。これは一般に、新しい GIN 演算子クラスの開発、または GIN インデックス可能列と btree インデックス可能列の両方に対する複数列 GIN インデックスの作成を除き、標準の B-tree インデックスより劣っています。 | create extension btree_gin |
フルテキスト検索辞書
名前 | 説明 | コマンド |
---|---|---|
dict-int | 整数のインデックスの作成方法を制御する、フルテキスト検索のためのフルテキスト検索辞書 | create extension dict_int |
unaccent | 文字からアクセントを削除するフィルタリングテキスト辞書 | create extension unaccent |
さらに、次の辞書はデフォルトでインストールされるため、拡張機能システムを使用して作成する必要はありません。
$ heroku pg:psql
=> \dFd
List of text search dictionaries
Schema | Name | Description
------------+-----------------+-------------------------------
pg_catalog | danish_stem | snowball stemmer for danish language
pg_catalog | dutch_stem | snowball stemmer for dutch language
pg_catalog | english_stem | snowball stemmer for english language
pg_catalog | finnish_stem | snowball stemmer for finnish language
pg_catalog | french_stem | snowball stemmer for french language
pg_catalog | german_stem | snowball stemmer for german language
pg_catalog | hungarian_stem | snowball stemmer for hungarian language
pg_catalog | italian_stem | snowball stemmer for italian language
pg_catalog | norwegian_stem | snowball stemmer for norwegian language
pg_catalog | portuguese_stem | snowball stemmer for portuguese language
pg_catalog | romanian_stem | snowball stemmer for romanian language
pg_catalog | russian_stem | snowball stemmer for russian language
pg_catalog | simple | simple dictionary: just lower case and check for stopword
pg_catalog | spanish_stem | snowball stemmer for spanish language
pg_catalog | swedish_stem | snowball stemmer for swedish language
pg_catalog | turkish_stem | snowball stemmer for turkish language
dblink
dblink は、Essential 層のデータベースでは使用できません
dblink: Postgres データベース間のクエリのサポートを追加します。dblink
を使用すると、個別の Heroku Postgres データベース間で、または外部の Postgres データベースとの間でクエリを実行できます。
pg_stat_statements
pg_stat_statements モジュールは、サーバーによって実行されているすべての SQL ステートメントの実行統計を追跡するための手段を提供します。
使用法
pg_stat_statements
を使用すると、パフォーマンスの問題を追跡できます。これにより、実行された各クエリとそれに関連するコストを表示する pg_stat_statements
という名前のビューが表示されます。これには、クエリが実行された回数、全体としてかかった合計のシステム実行時間、全体としてヒットした共有メモリ内のブロックの合計数が含まれます。
pg_stat_statements
では、それまでの実行時間の長さには関係なく、取り消されたクエリは取得されません。つまり、statement_timeout
によって取り消された長時間実行クエリは pg_stat_statements
ビューに反映されません。取り消された高コストのクエリを効果的に診断するには、Postgres ログを使用する必要があります。
PostGIS
PostGIS モジュールは、PostgreSQL オブジェクトリレーショナルデータベースに地理オブジェクトのサポートを追加します。実際上、PostGIS は PostgreSQL サーバーを “空間的に有効にする” ため、地理情報システム (GIS) のバックエンド空間データベースとして使用できます。
要件
PostGIS は、すべての Heroku Postgres データベースプランで使用できます。
Heroku Postgres でサポートされている PostGIS のバージョンは次のとおりです。
- PostGIS v2.5、PostgreSQL 13 以前で実行されているデータベースの場合
- PostGIS v3.3、PostgreSQL 14 以降で実行されているデータベースの場合
プロビジョニング
データベースが上記の要件を満たしている限り、他の拡張機能と同様に PostGIS を追加できます。
PostGIS を既存の Heroku Postgres データベースにインストールするには、psql
セッションを開き、CREATE EXTENSION postgis;
を実行します。
$ heroku pg:psql DATABASE_URL -a example-app
--> Connecting to postgresql-octagonal-12345
psql (13.2, server 11.12 (Ubuntu 11.12-1.pgdg16.04+1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
example-app::DATABASE=> CREATE EXTENSION postgis;
CREATE EXTENSION
データベースに PostGIS がインストールされているかどうかを確認するには、psql
から次のクエリを実行します。
=> SELECT postgis_version();
postgis_version
---------------------------------------
2.5 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)
pgvector
Heroku Postgres の pgvector
拡張機能により、ベクトルデータタイプのサポートが追加されます。「Heroku Postgres での pgvector」を参照してください。
サポートされなくなった拡張機能
Heroku はプラットフォームで廃止された拡張機能を削除します。
- PLV8 - この拡張機能の Heroku ベータ期間中、Debian/Ubuntu での PG11+ に対する PLV8 パッケージのメンテナンスは廃止されました。詳細は、ここを参照してください。これが変更された場合、PLV8 を再び設定します。
chkpass
は Postgres 11 以降ではサポートされていません。xml2
は廃止されました。