Amazon Aurora DSQLがアイデンティティカラムとシーケンスオブジェクトをサポート
新機能の背景
PostgreSQLアプリケーションの移行を容易に
従来、PostgreSQLからAurora DSQLへの移行では、自動インクリメント機能を持つアイデンティティカラムやシーケンスオブジェクトがサポートされていませんでした。この機能がないことで、既存のPostgreSQLアプリケーションの移行には追加の開発作業が必要となり、移行の障壁となっていました。
データベース管理の整数IDの需要
多くのアプリケーションでは、注文番号、アカウントID、オペレーション参照番号などの人間にとって読みやすい整数ベースのIDが求められます。これまでは、アプリケーションコードやミドルウェアにカスタムID生成ロジックを実装する必要があり、開発の複雑性が増していました。
分散データベースにおけるID生成の課題
Aurora DSQLは分散SQLデータベースとして設計されており、UUIDベースの識別子が推奨されてきました。しかし、レポート作成、外部システムとの統合、ビジネスプロセスにおいては、コンパクトで順序性のある整数IDが必要となるケースが多く存在します。
新機能の概要
アイデンティティカラム(IDENTITY Columns)
アイデンティティカラムは、データベースが自動的に生成する特別なカラムで、テーブルに新しい行が挿入されるたびに、一意の整数値を自動的に割り当てます。
主な特徴:
GENERATED ALWAYS AS IDENTITYまたはGENERATED BY DEFAULT AS IDENTITY構文を使用して作成- 暗黙的なシーケンスから自動的に値を生成
ALWAYSオプションでは明示的な値の挿入を制限し、より強力な保護を提供BY DEFAULTオプションでは明示的な値の挿入を許可し、デフォルト値のような動作を実現- 自動的に
NOT NULL制約が適用される
作成例:
CREATE TABLE people (
id bigint GENERATED ALWAYS AS IDENTITY (CACHE 70000),
name text,
address text
);
シーケンスオブジェクト(SEQUENCE Objects)
シーケンスは、一連の一意な整数値を生成するためのデータベースオブジェクトです。テーブルから独立して管理でき、複数のテーブルやカラムで共有することができます。
主な特徴:
CREATE SEQUENCEコマンドで作成nextval(),currval(),setval(),lastval()などの操作関数をサポート- INCREMENT BY、START WITH、MAXVALUE、MINVALUEなどのパラメータで動作をカスタマイズ可能
- CACHE設定による高性能なID生成
PostgreSQL互換性
Aurora DSQLのアイデンティティカラムとシーケンスは、PostgreSQLの標準SQL構文と互換性があります。これにより、既存のPostgreSQLアプリケーションのスキーマやクエリをほとんど変更せずに移行できます。
利用可能なリージョン
この機能は、Aurora DSQLが提供されているすべてのAWSリージョンで利用可能です(2026年2月時点で14リージョン:US East (N. Virginia)、US East (Ohio)、US West (Oregon)、Canada (Central)、Canada West (Calgary)、Asia Pacific (Melbourne)、Asia Pacific (Sydney)、Asia Pacific (Osaka)、Asia Pacific (Tokyo)、Asia Pacific (Seoul)、Europe (Ireland)、Europe (London)、Europe (Frankfurt)、Europe (Paris))。
使い方
基本的なアイデンティティカラムの作成
ALWAYS オプション:
CREATE TABLE orders (
order_id bigint GENERATED ALWAYS AS IDENTITY (CACHE 70000),
customer_name text,
order_date timestamp,
PRIMARY KEY (order_id)
);
-- 挿入時にIDを指定しない(自動生成)
INSERT INTO orders (customer_name, order_date)
VALUES ('山田太郎', NOW());
-- DEFAULTキーワードでも明示的に自動生成を要求可能
INSERT INTO orders (order_id, customer_name, order_date)
VALUES (DEFAULT, '佐藤花子', NOW());
BY DEFAULT オプション(明示的な値の挿入を許可):
CREATE TABLE accounts (
account_id bigint GENERATED BY DEFAULT AS IDENTITY (CACHE 70000),
account_name text
);
-- 自動生成
INSERT INTO accounts (account_name) VALUES ('企業アカウントA');
-- 明示的な値の挿入も可能
INSERT INTO accounts (account_id, account_name) VALUES (1000, '特別アカウント');
シーケンスの作成と利用
シーケンスの作成:
CREATE SEQUENCE invoice_number_seq
START WITH 1000
INCREMENT BY 1
CACHE 10000;
シーケンスの使用:
-- 次の値を取得
SELECT nextval('invoice_number_seq');
-- テーブルへの挿入で使用
INSERT INTO invoices (invoice_number, customer_id, amount)
VALUES (nextval('invoice_number_seq'), 123, 50000);
-- 現在の値を確認
SELECT currval('invoice_number_seq');
-- 最後に挿入された値を取得
SELECT lastval();
CACHEサイズの選択
Aurora DSQLの分散アーキテクチャにおいて、CACHE設定は性能に重要な影響を与えます。
大きなCACHEサイズ(CACHE >= 65536)が適している場合:
- 高頻度でIDが生成されるワークロード
- 多数の同時セッションから挿入が行われる
- IDの間に欠番が発生しても問題ない
- 例:IoTテレメトリー、イベント取り込み、ジョブ実行ID、サポートケース参照番号
CREATE TABLE telemetry_events (
event_id bigint GENERATED ALWAYS AS IDENTITY (CACHE 100000),
device_id text,
event_data jsonb,
recorded_at timestamp
);
小さなCACHEサイズ(CACHE 1)が適している場合:
- IDの生成頻度が比較的低い
- IDが割り当て順序に従うことが期待される
- 欠番を最小化することが重要
- 例:アカウント番号、参照番号
CREATE TABLE customer_accounts (
account_number bigint GENERATED ALWAYS AS IDENTITY (CACHE 1),
account_name text,
created_at timestamp
);
UUIDとの併用パターン
Aurora DSQLでは、スケーラビリティが重要な場合にUUIDを主キーとして使用することが推奨されています。整数IDは、人間が読みやすい識別子やレポート用の補助的な識別子として併用することができます。
CREATE TABLE products (
product_uuid uuid DEFAULT gen_random_uuid() PRIMARY KEY,
product_number bigint GENERATED ALWAYS AS IDENTITY (CACHE 10000),
product_name text,
price numeric(10,2)
);
-- UUIDは主キーとして内部的に使用
-- product_numberは外部向けの製品番号として使用
アイデンティティカラムの変更
既存のアイデンティティカラムの設定は、ALTER TABLEコマンドで変更できます。
-- CACHE設定の変更
ALTER TABLE orders
ALTER COLUMN order_id SET CACHE 50000;
-- GENERATED動作の変更
ALTER TABLE orders
ALTER COLUMN order_id SET GENERATED BY DEFAULT;
-- アイデンティティプロパティの削除
ALTER TABLE orders
ALTER COLUMN order_id DROP IDENTITY;
注意点
1. 一意性の保証について
アイデンティティカラムは自動的に一意な値を生成しますが、一意性制約は自動的には適用されません。一意性を強制するには、明示的にPRIMARY KEYまたはUNIQUE制約を定義する必要があります。
-- 推奨:PRIMARY KEYまたはUNIQUE制約を追加
CREATE TABLE orders (
order_id bigint GENERATED ALWAYS AS IDENTITY (CACHE 70000),
order_info text,
PRIMARY KEY (order_id) -- 一意性を保証
);
2. CACHE設定の重要性
CACHE設定は、Aurora DSQLの分散環境でのパフォーマンスに大きな影響を与えます。
注意点:
- CACHEサイズが小さすぎると、分散環境での調整オーバーヘッドが増加し、スループットが低下する
- CACHEサイズが大きすぎると、IDの欠番が大きくなる可能性がある
- デフォルトのCACHE設定を使用する場合は、ワークロードパターンに適しているか確認する
3. 欠番の発生
以下の状況でIDに欠番が発生する可能性があります:
- トランザクションのロールバック
- 複数セッションでのCANCEL操作による値のキャッシュ
- サービスの再起動や障害発生時
対策: 欠番が許容できないビジネスロジックの場合は、CACHE=1を設定し、生成頻度を低く保つ必要があります。
4. データ型の制限
アイデンティティカラムに使用できるデータ型は、シーケンスがサポートするデータ型に限定されます:
smallint(2バイト)integer(4バイト)bigint(8バイト)
大量のIDが必要な場合は、bigintの使用を推奨します。
5. トランザクション制限との関係
Aurora DSQLには、単一トランザクションで変更できる行数に制限があります。大量のデータを一度に挿入する場合は、バッチ処理を1,000行単位などに分割することが推奨されます。
-- バッチ処理の例
DO $$
DECLARE
batch_size INT := 1000;
BEGIN
FOR i IN 1..10 LOOP
INSERT INTO events (event_type, event_data)
SELECT 'type' || j, 'data' || j
FROM generate_series(1, batch_size) j;
COMMIT;
END LOOP;
END $$;
6. 既存のPostgreSQLからの移行時の注意
- PostgreSQLの
SERIAL型を使用している場合は、GENERATED AS IDENTITY構文に置き換えることが推奨される(より標準SQL準拠) - 既存のシーケンス定義は互換性があるが、CACHE設定を見直してAurora DSQLの分散環境に最適化する必要がある
7. UUIDとの使い分け
Aurora DSQLの公式ドキュメントでは、以下のガイダンスが示されています:
- 主キーには原則としてUUIDを使用:分散環境での調整が不要でスケーラビリティが高い
- 整数IDは補助的な識別子として使用:人間が読みやすい参照番号、レポート、外部インターフェース向け
8. 料金への影響
アイデンティティカラムとシーケンスの使用自体に追加料金はかかりませんが、以下の点に注意:
- 小さなCACHE設定では、調整のためのトランザクションが増加し、間接的にコストに影響する可能性がある
- 大きなCACHE設定を使用することで、調整オーバーヘッドを削減し、コスト効率を向上できる
補完情報の出典
- Amazon Aurora DSQL adds support for IDENTITY columns and SEQUENCE objects - AWS What's New
- Sequences and identity columns - Amazon Aurora DSQL - AWS公式ドキュメント
- Identity columns - Amazon Aurora DSQL - AWS公式ドキュメント
- Working with sequences and identity columns - Amazon Aurora DSQL - AWS公式ドキュメント
- Migrating from PostgreSQL to Aurora DSQL - AWS公式ドキュメント
- Amazon Aurora DSQL Product Page - AWS公式サイト