PostgreSQLとの互換性
PostgreSQL互換のTiDB Cloud Starterインスタンスは、PostgreSQL wire protocol(pgwire v3)と、一般的なPostgreSQL SQL構文およびアプリケーションパターンをサポートします。ほとんどのPostgreSQLクライアント、ドライバー、ORMは、標準のPostgreSQL接続文字列を使用して接続できます。
ただし、この実装はPostgreSQLと同一ではありません。一部のPostgreSQL機能はサポートされていないか、動作が異なります。特に、PostgreSQL固有のストレージ、レプリケーション、拡張機能、またはトランザクションセマンティクスに依存する機能に違いがあります。
サポートされる機能
PostgreSQL互換のTiDB Cloud Starterインスタンスは、以下のPostgreSQL機能をサポートします。
- ワイヤプロトコル: PostgreSQL wire protocol v3。Simple QueryおよびExtended Query(
Parse/Bind/Describe/Execute)を含みます。 - DDL: テーブル、B-tree、GIN、HNSWインデックス、ビュー、マテリアライズドビュー、スキーマ、シーケンス、関数、トリガー、型、照合順序に対する
CREATE、ALTER、DROP。 - DML:
RETURNING付きのINSERT、UPDATE、DELETE、およびINSERT ... ON CONFLICT(upsert)。 - クエリ: テーブル結合(inner、left、right、full outer、cross、lateral)、共通テーブル式(CTE)、再帰CTE、ウィンドウ関数、サブクエリ、集合演算(
UNION、INTERSECT、EXCEPT)。 - トランザクション:
BEGIN、COMMIT、ROLLBACK、セーブポイント、自動コミット。 - データ型: Boolean、integer、bigint、double precision、numeric、text、varchar、bytea、timestamp/timestamptz、date、time、interval、UUID、JSON/JSONB、配列、serial/bigserial、vector、tsvector、tsquery。
- PL/pgSQL: 関数、プロシージャ、制御フロー、動的
EXECUTEを、一部制限付きでサポートします。WHILE、FOREACH、カーソルはサポートされません。EXCEPTIONおよびネストされたブロックにはDOブロックが必要です。 - トリガー:
INSERT、UPDATE、DELETEに対するBEFOREおよびAFTERトリガーを、一部制限付きでサポートします。詳細はトリガーを参照してください。 - インデックス: B-tree(デフォルト)、GIN、部分インデックス、式インデックス、
CREATE INDEX CONCURRENTLY、HNSWベクトルインデックス。GiST、Hash、SP-GiST、BRINインデックスはサポートされません。
サポートされない機能
以下のPostgreSQL機能はサポートされていません。
RANGE、LIST、HASHパーティショニングを含むテーブルパーティショニング。- テーブル継承。
- 外部データラッパー(FDW)。
- テーブルスペース。
CREATE RULEで作成されるルール。- 論理レプリケーション。
- ストリーミングレプリケーション。
- 真の
SERIALIZABLE分離レベル。 DEFERRABLEトランザクション。- PostgreSQLのラージオブジェクト(OIDベースのラージオブジェクトストレージ)。代わりにバイナリデータには
BYTEAを使用してください。 XML、CIDR、MACADDRデータ型。- PostgreSQLの範囲型(
INT4RANGEの部分サポートを除く)。 - PL/pgSQL以外の手続き言語(PL/Python、PL/Perl、PL/v8など)。
- PL/pgSQLの
WHILEループ、FOREACHループ、カーソル操作。 - カスタムまたはサードパーティのPostgreSQL拡張機能。
PostgreSQLとの違い
トランザクション分離レベル
デフォルトのトランザクション分離レベルはREAD COMMITTEDです。READ COMMITTEDとREPEATABLE READがサポートされています。
READ UNCOMMITTEDは、PostgreSQLの動作と同様にREAD COMMITTEDとして動作します。
PostgreSQL Serializable Snapshot Isolation(SSI)はサポートされていません。PostgreSQL wire protocol経由でSERIALIZABLEを要求した場合、トランザクションはREPEATABLE READにダウングレードされ、警告が返されます。
例:
BEGIN ISOLATION LEVEL SERIALIZABLE;
SHOW transaction_isolation;
実際に有効な分離レベルはREPEATABLE READです。
アプリケーションがPostgreSQLのSERIALIZABLEセマンティクスに依存している場合は、必要に応じてトランザクションロジックを見直し、再設計してください。明示的な行ロックやデータベース制約によって特定の不変条件を保護することはできますが、PostgreSQL Serializable Snapshot Isolation(SSI)のセマンティクスは提供されません。
データ型
一般的によく使われるPostgreSQLデータ型の多くはサポートされていますが、以下の型には互換性上の違いがあります。
以下のPostgreSQLデータ型はサポートされていません。
XMLCIDRMACADDRMONEYINT8RANGENUMRANGEDATERANGETSRANGETSTZRANGE
DDLとスキーマの動作
一般的なPostgreSQL DDLの多くはサポートされていますが、一部の操作は異なります。
CREATE TABLE ASとSELECT INTOはサポートされていますが、作成されるテーブルには追加の_rowid主キー列が含まれ、SELECT *で表示されます。ALTER SEQUENCEは、OWNER TOやOWNED BYなどの所有権関連の操作のみをサポートします。RESTART、INCREMENT BY、RENAME TOを含むその他の句はサポートされません。シーケンスの現在値を変更するには、setval()を使用してください。TRUNCATEは基本的な単一テーブル形式のみをサポートします。複数テーブルのTRUNCATEや、CASCADE、RESTRICT、ONLY、RESTART IDENTITY、CONTINUE IDENTITYなどのオプション句はサポートされません。- 外部キーは、
CASCADE、SET NULL、SET DEFAULT、RESTRICT、NO ACTIONの参照アクションをサポートします。 - 外部キー依存関係の扱いはPostgreSQLと異なります。参照先テーブルを、
CASCADEまたはRESTRICT付きで削除した場合も含めて削除すると、孤立した外部キー制約が残ることがあります。これらの制約により、pg_constraintおよびinformation_schema.referential_constraintsに対するクエリが失敗する可能性があります。この問題を避けるには、参照先テーブルを削除する前に、参照元の外部キー制約を削除してください。 - 遅延外部キー検証はサポートされていません。
DEFERRABLE INITIALLY DEFERREDで宣言された外部キー制約は受け付けられますが、トランザクションコミット時ではなく即時に検証されます。遅延外部キー検査に依存するアプリケーションでは、トランザクション失敗が発生する可能性があります。 - enum型はサポートされますが、enum値は宣言順ではなくラベル文字列でソートされます。
- PostgreSQLのテーブルパーティショニングとテーブル継承はサポートされていません。
インデックス
B-tree、GIN、HNSWインデックスアクセスメソッドがサポートされています。
一意インデックス、式インデックス、部分インデックス、CREATE INDEX CONCURRENTLYもサポートされています。
以下のPostgreSQLインデックスアクセスメソッドはサポートされていません。
- GiST
- Hash
- SP-GiST
- BRIN
HNSWは、ベクトルワークロード向けにサポートされる近似最近傍インデックス型です。追加の構造要件およびクエリ形状要件があります。
TiDB Cloudで提供されていないその他のpgvectorインデックス型(IVFFlatなど)は利用できません。
COPY
COPY ... FROM STDINは、PostgreSQL wire protocol経由でtext形式およびCSV形式をサポートします。
以下のPostgreSQL COPY機能はサポートされていません。
- バイナリ
COPY COPY (SELECT ...) TO STDOUT
PL/pgSQL
PL/pgSQLは部分的にサポートされています。変数、代入、SELECT INTO、IF/ELSIF/ELSE、FORループ、PERFORM、EXIT、CONTINUE、RAISE、動的EXECUTEなどの一般的な構文はサポートされています。
以下の制限があります。
WHILEループはサポートされていません。FOREACHループはサポートされていません。- カーソルおよび
REFCURSOR操作はサポートされていません。 BEGIN ... EXCEPTIONによる例外処理は、DOブロック内でのみサポートされます。- ネストされた手続きブロックは、
DOブロック内でのみサポートされます。
トリガー
INSERT、UPDATE、DELETEに対するBEFOREおよびAFTERトリガーはサポートされていますが、以下の互換性上の違いがあります。
BEFOREトリガー関数では、ループ、PL/pgSQLのCASE文、動的EXECUTE、例外ハンドラー、ネストされたブロックを使用できません。FOR EACH STATEMENTは受け付けられますが、PostgreSQLの文単位セマンティクスではなく、行単位セマンティクスで実行されます。AFTERトリガーでは、単独のRETURN NEWまたはRETURN OLDは、その行の唯一の文として記述する必要があります。
拡張機能
PostgreSQL互換のTiDB Cloud Starterインスタンスは、事前定義された拡張機能セットと組み込み機能を提供します。
任意のカスタムまたはサードパーティのPostgreSQL拡張機能はインストールできません。TiDB Cloudが明示的にサポートする拡張機能のみ利用できます。
利用可能な拡張機能の一覧と、拡張機能固有の制限については、サポートされているPostgreSQL拡張機能を参照してください。
レプリケーション
PostgreSQLの論理レプリケーションおよびストリーミングレプリケーションはサポートされていません。
PostgreSQL互換性のために、一部のパブリケーションやレプリケーションスロットのカタログオブジェクトまたは関数が存在する場合がありますが、実際に動作するレプリケーションや変更データキャプチャ(CDC)は提供しません。CREATE SUBSCRIPTIONはサポートされていません。
システムカタログとツール
PostgreSQL互換のTiDB Cloud Starterインスタンスは、スキーマのイントロスペクションのために、一般的によく使われるpg_catalogおよびinformation_schemaオブジェクトを実装しています。
カタログの表面仕様はPostgreSQLと同一ではありません。一部のカタログビュー、カラム、統計情報、およびPostgreSQL固有のサーバー関数は利用できないか、部分的にしか実装されていません。
PostgreSQL固有のカタログや統計情報の動作に依存するツールは、使用前に検証してください。
移行に関する考慮事項
既存の PostgreSQL アプリケーションを移行する前に、ワークロードが未サポートの機能、または動作が異なる機能に依存していないかを確認してください。該当するものには、以下が含まれます。
- テーブルパーティショニングまたはテーブル継承。
- 外部データラッパー。
- 論理レプリケーションまたはストリーミングレプリケーション。
SERIALIZABLEトランザクション分離レベル。- 未サポートの PostgreSQL データ型。
- GiST、Hash、SP-GiST、BRIN を含む、未サポートのインデックスアクセスメソッド。
- カスタムまたはサードパーティの PostgreSQL 拡張機能。
WHILEループ、FOREACHループ、カーソル、関数本体内の例外処理など、未サポートの PL/pgSQL 機能。
本番ワークロードを移行する前に、アプリケーションのスキーマとクエリを確認し、テストしてください。