Heroku Postgres での拡張機能、PostGIS、フルテキスト検索辞書
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2023年05月12日(金)
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 データベースで新しく作成されるすべての拡張機能は heroku_ext
スキーマにインストールされていました。新しいデータベースで heroku_ext
スキーマの外部に拡張機能をインストールするには、Postgres データベースのプロビジョニング時に、--allow-extensions-on-public-schema
フラグを設定します。
$ heroku addons:create heroku-postgresql:standard-0 \
--allow-extensions-on-public-schema
このフラグはすべての Production 層の Heroku Postgres プラン (Standard、Premium、Private、Shield) に機能します。
既存の Production 層のデータベースで heroku_ext
スキーマの外部に拡張機能をインストールするには、「Heroku Data Labs: Heroku Postgres の任意のスキーマでの拡張機能」の記事を参照してください。
拡張機能のアップグレード
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=>
データ型
Bloom は、空間効率の高いブルームフィルターのインデックスを提供します。
create extension bloom
Case Insensitive Text。大文字と小文字が区別されないテキストデータ型。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: 製品 ID およびシリアル番号 (UPC、ISBN、ISSN など)。
create extension isn
Seg: セグメントまたは浮動小数点区間を表すための型を提供します。
create extension seg
外部データラッパー
- postgres_fdw を使用すると、Postgres データベースは、外部サーバーとして別の Postgres データベースにアクセスできます。
外部データラッパーは、Essential 層のデータベースでは使用できません。
関数
Address Standardizer: 一連の定義されたルールに関するアドレスを正規化する 1 行のアドレスパーサー
create extension address_standardizer
。US アドレスの一連のルールはすでに含まれていますcreate extension address_standardizer_data_us
。Autoinc: シーケンスの次の値を整数フィールドに保存します。
create extension autoinc
Earth Distance: 地球上の地点間の距離を計算するための関数。
create extension earthdistance
Fuzzy Match: 文字列間の類似性を判定するための別の方法。UTF-8 のサポートは限定されています。
create extension fuzzystrmatch
のようなコードを使用して、イベントを表す sObject を作成して適切なエンドポイントに POST します。Insert Username: 現在のユーザーの名前をテキストフィールドに挿入します。
create extension insert_username
Intarray: 整数の null のない配列のソート、操作、およびそのインデックスの作成を行います。
create extension intarray
ModDateTime: 現在のタイムスタンプをタイムスタンプフィールドに挿入します。
create extension moddatetime
PGCrypto: 暗号化関数によってデータベース内の暗号化が可能になります。
create extension pgcrypto
pg_partman: 時間ベースとシリアルベースの両方のテーブルパーティションセットを作成して管理します。サブパーティション分割もサポートされています。
pg_prewarm: 新しく起動されるデータベースや休止データベースのパフォーマンスを正規化するために、オペレーティングシステムまたはデータベースバッファキャッシュにデータを事前ロードします。
pg_partman と pg_prewarm は、Essential 層のデータベースでは使用できません。
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
tsm_system_time: システム時刻を使用したテーブルサンプリングを提供します。
create extension tsm_system_time
UUID Generation: データベース内の v1、v3、v4、v5 の UUID を生成します。既存の UUID データ型と適切に連携します。
create extension "uuid-ossp"
統計
- Row Locking: テーブルの行ロックの情報を表示します。
create extension pgrowlocks
インデックスの種類
btree-gist: GiST インデックス演算子。これは一般に、B-tree では使用できない複数列インデックスや排他制約を除き、標準の B-tree インデックスより劣っています。
create extension btree_gist
btree-gin: GIN インデックス演算子。これは一般に、新しい GIN 演算子クラスの開発、または GIN インデックス可能列と btree インデックス可能列の両方に対する複数列 GIN インデックスの作成を除き、標準の B-tree インデックスより劣っています。
フルテキスト検索辞書
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: Postgres データベース間のクエリのサポートを追加します。dblink を使用すると、個別の Heroku Postgres データベース間で、または外部の Postgres データベースとの間でクエリを実行できます。
dblink は、Essential 層のデータベースでは使用できません
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) のバックエンド空間データベースとして使用できます。
Heroku Postgres での PostGIS サポートはベータ版であり、将来変更される可能性があります。
要件
PostGIS は、Standard 層以上のデータベースおよび Essential 層のデータベースで使用できます。
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)
サポートされなくなった拡張機能
- PLV8 - この拡張機能の Heroku ベータ期間中、Debian/Ubuntu での PG11+ に対する PLV8 パッケージのメンテナンスは廃止されました。詳細は、ここを参照してください。これが変更された場合、PLV8 を再び設定します。