CosmosDB for PostgreSQLを使用する場合、そのもととなっているCitusと制約事項は同じなのではと思い、Citusの制約事項を調べた時のメモ。Citusの最新バージョンは12だが、CosmosDB for PostgreSQLは11.3で動いているらしいので11.3で調べている。。。
使用するかもしれない用途は、マルチテナントで提供するサービスであるため、distribution columnをキーにしていること...や、単一シャード内でのみ有効...は通常用途では問題とならないが、サービス運用/管理時にシャードをまたいで処理を行いたいようなときに課題がありそうと感じた。
Creating and Modifying Distributed Objects (DDL)
-
distribution columnのデータ型は変更できない
一時的にdistribution columnを変更した後で必要なデータ型変更を行い、distribution columnを変更することで回避可能 -
ワーカーノードをまたいだ一意性制約/外部参照制約は使えない
同一ワーカーノード内で制約を作成する場合、distribution columnをキーに含めること
外部参照制約を設定できるのは下記- 2つのローカルテーブルの間
- 2つの参照テーブルの間
- ローカルテーブルと参照テーブルの間 ただし、参照テーブルからローカルテーブルを参照する場合、ON DELETE(UPDATE) CASCADEは使用できない
- 同一シャードにある分散テーブルの間 ただしdistribution columnをキーに含んでいること
- 分散テーブルが参照テーブルを参照する場合 逆に参照テーブルから分散テーブルを参照することはできない
Ingesting, Modifying Data (DML)
-
デフォルトの設定では、複数のシャードにまたがる更新/削除は、1PhaseCommitが使用される
オプション設定により、2PhaseCommitに変更できる - 単一シャードに対する操作の場合は、SELECT ... FOR UPDATEが使用できる
Querying Distributed Tables (SQL)
- 集計がどこで行われるかが性能を左右する(上から性能が良い)
- distribution columnでグルーピングしている場合は単一ワーカーノードで処理が完結する
- avg min(他多数)などの集計の場合は各ワーカーでシャード内の集計を実施、コーディネーターノードに送付する。コーディネーターノードはそれらから最終的な集計結果を算出する
- 上記以外の場合は、各ワーカーで集計条件に該当する行を抽出し、コーディネーターノードに送付する。コーディネータノードはそれらを使用して集計を実施する
- マテリアライズドビューはローカルテーブルとしてコーディネーターノードに格納される
SQL Support and Workarounds
- SELECT ... FOR UPDATEは単一シャードでのみ有効
- TABLESAMPLEは単一シャードでのみ有効
- 相関サブクエリは結合条件のカラムががdistribution columnに含まれている場合のみサポートされる
- 分散テーブルの外部結合は結合条件がdistribution columnに含まれている場合のみサポートされる
- WITH RECURSIVEは単一シャードでのみ有効
- GROUPING SETSは単一シャードでのみ有効
- MERGEは下記の場合のみサポートされる
source | target | 備考 |
---|---|---|
ローカルテーブル | ローカルテーブル | |
分散テーブル | 分散テーブル | 同一シャード内のみ |