📣新登場!TiDB Cloud BYOC、TiDB Cloud Filesystem、PostgreSQL-compatible TiDB Cloud Starter がパブリックプレビュー中。このページは自動翻訳されたものです。原文はこちらからご覧ください。

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型動作
SMALLINT / INT2受け付けられ、内部的には32ビット整数として保存されます。PostgreSQLのSMALLINTの範囲(-32768~32767)は強制されません。
REAL / FLOAT4受け付けられ、内部的にはDOUBLE PRECISIONとして保存されます。PostgreSQLの単精度浮動小数点のセマンティクスは保持されません。
CHAR(n) / CHARACTER(n)受け付けられ、内部的にはVARCHARとして保存されます。PostgreSQLのような空白埋めは行われないため、空白埋めされた文字列との比較で結果が異なる場合があります。
INETIPv4およびIPv6のホストまたはネットワークアドレスについて、等価比較と順序比較をサポートします。PostgreSQLのネットワーク固有の演算子や関数はサポートされません。
INT4RANGE部分的にサポートされます。等価(=)および重なり(&&)演算子はサポートされます。包含演算子(@>および<@)はサポートされません。upper()やisempty()などのPostgreSQLの範囲型アクセサ関数は利用できないか、期待どおりに動作しません。
複合型宣言でき、テキストリテラルを使って書き込むこともできますが、値をフィールド単位で読み取ることはできません。
BIT / VARBIT互換性上の違いを伴って受け付けられます。値はBYTEAのセマンティクスを使用し、宣言されたビット長は強制されません。長すぎる値は拒否または切り捨てされず、そのまま保持されます。B'1010'のようなPostgreSQLのビット文字列リテラルはサポートされません。
配列1次元配列をサポートします。多次元配列はサポートされません。

以下のPostgreSQLデータ型はサポートされていません。

  • XML
  • CIDR
  • MACADDR
  • MONEY
  • INT8RANGE
  • NUMRANGE
  • DATERANGE
  • TSRANGE
  • TSTZRANGE

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 機能。

本番ワークロードを移行する前に、アプリケーションのスキーマとクエリを確認し、テストしてください。

このページは役に立ちましたか?