はじめに
DataSpider Servista JDBCアダプタでPostgreSQL 18に接続し、UUIDv7を生成しました。
DataSpider Servistaはセゾンテクノロジーのデータ連携プラットフォームです。豊富なアダプタを提供し、様々なシステムと連携できることがアピールポイントです。
PostgreSQLとはPostgreSQLアダプタで接続できます。しかし、PostgreSQLアダプタはサポートするPostgreSQLのバージョンが定められています。DataSpider 4.5SP1のPostgreSQLアダプタはPostgreSQL 12からV16までをサポートします。
DataSpider 4.5SP1は2025年2月5日リリースです。2025年9月25日にリリースされたPostgreSQL 18をサポートしていなくても無理はないものです。
PostgreSQLアダプタがPostgreSQL 18をサポートしていなくても諦める必要はありません。DataSpiderにはJDBCアダプタという任意のJDBCドライバを利用して接続できる汎用アダプタを提供しています。但し、これは特定の接続先をサポートしない汎用アダプタであり、利用者自身が検証する必要があります。そこで実際に検証します。
2026年2月9日に後継バージョンのDataSpider Servista 5.0.0がリリースされましたが、PostgreSQLアダプタのサポートバージョンは14から17までで、18は未サポートです。
利用したソフトウェア
- DataSpider Servista Advanced Server Package 4.5SP1 Windows版
- PostgreSQL 18.1 Windows版
- PostgreSQL JDBC Driver 42.7.9
PostgreSQL 18.1は2025年11月13日にリリースされたもので、検証時点の最新リビジョンです。脱稿後の2026年2月12日に18.2がリリースされ、2月26日に18.3がリリースされました。
JDBCドライバ配備
JDBCアダプタを利用するためにはJDBCドライバをDataSpiderに配備します。
- JDBCドライバを以下のパスに配置します。
| ファイル名 | パス |
|---|---|
| postgresql-42.7.9.jar | <DataSpider導入ディレクトリ>\server\plugin\data_processing\modules\jdbc_adapter |
- DataSpiderサービスを再起動します。
グローバルリソース
続いてグローバルリソースを設定します。
- DataSpider Studioにログインします。
- コントロールパネルの「グローバルリソースの設定」を開きます。
- JDBCアダプタのグローバルリソースを新規作成します。
- 必須設定タブで以下を設定します。
| 項目 | 値 |
|---|---|
| ドライバクラス名 | org.postgresql.Driver |
| URL | jdbc:postgresql://<PostgreSQLのIPアドレス>:<ポート番号>/<データベース名> |
| ユーザ名 | PostgreSQLのユーザ名 |
| パスワード | PostgreSQLのパスワード |
- 「接続テスト」ボタンをクリックし、接続テストを実施します。「接続に成功しました」と表示されたら成功です。
- 「完了」をクリックします。
DataSpider StudioにはWindowsアプリケーションのStudio for Desktopとブラウザベース(ClickOnceアプリケーション)のStudio for Webがあります。
オリジナルはfor Desktopであり、Studioと言えばfor Desktopでしたが、V4.5ではfor Desktopが非推奨になりました(次期バージョン5.0.0で廃止されました)。
今回の操作は、どちらでも可能です。この記事では推奨されるfor Webに基いています。
UUIDv7生成
今回はPostgreSQL 18ならではの処理として、PostgreSQL 18で新規追加されたuuidv7()関数を実行してみます。uuidv7()関数はUUIDv7を生成する関数です。
UUID: Universally Unique IDentifierは128ビット長の一意になるように生成された識別子です。ハイフン区切りの36文字の文字列として表現されます。中央集権的なID発行の機関を用意しなくても済むため、分散環境でのIDの採番などに利用されています。
UUIDには幾つかのバージョンがあり、フォーマットが定められています。従来普及していたUUIDv4はランダムな文字列です。そのシンプルさと衝突の可能性の低さがアピールポイントです。しかし、ランダムなIDはデータベースのインデックス効率を低下させ、特に大量のデータを扱う際にパフォーマンスのボトルネックとなります。
そこで2024年5月に新たなバージョンUUIDv7がRFC 9562で標準化されました。これは先頭48ビットにミリ秒精度のタイムスタンプを格納します。これによりユニークでありながら、時系列順の並び(ソート)を実現します。トランザクションデータやログデータのキーに向いています。
uuidv7()関数はデフォルトでは引数なしで実行します。この場合はシステム時刻(ミリ秒精度)に基づくUUID v7 を生成します。
スクリプト
それではDataSpiderのJDBCアダプタを利用して、PostgreSQL 18のuuidv7()関数を呼び出してみます。
JDBCアダプタには以下の処理が提供されています。
- テーブル読み取り
- 検索系SQL実行
- テーブル書き込み
- 更新系SQL実行
- ストアドプロシージャ実行
このうち、検索系SQL実行処理は任意のSQL文を実行して応答を取得します。DataSpiderはJavaで開発されたソフトウェアです。検索系SQL実行処理は内部的にはjava.sql.Statementクラスまたはjava.sql.PreparedStatementクラスのexecuteQuery()メソッドを実行します。
この検索系SQL実行処理をスクリプトから呼び出してuuidv7()関数を実行します。スクリプトはDataSpider Studioのデザイナで作成します。StartからEndまでにアイコンを配置し、矢印で繋げます。
具体的な手順は以下になります。
- DataSpider Studioにログインします。
- デザイナでプロジェクトを開きます。
- スクリプトを新規作成します。
- ツールパレットからJDBCアダプタの検索系SQL実行処理を選択し、マッピングキャンバスにドラッグします。
- 検索系SQL実行処理のプロパティが表示されます。
- 接続先のプルダウンに作成したグローバルリソースを指定します。
- SQL欄に以下のSQL文を記載します。
SELECT uuidv7();
- 「抽出テスト」をクリックし、成功を確認します。
※不正なSQL文を指定した場合はテストに失敗します。 - 「SQL文を実行して出力スキーマを定義」をクリックし、「出力スキーマ定義」欄に出力項目が設定されたことを確認します。
- 完了をクリックします。
- スクリプトキャンバスで以下のように矢印(データフロー)を繋げます。
Start→検索系SQL実行処理→End - プロジェクトを保存します。
- デザイナのメニューのツール > オプションを選択します。
- オプション設定画面が表示されます。ログレベルのプルダウンをDEBUGに変更して「了解」をクリックします。
- デザイナのツールバーから「デバッグ実行」をクリックします。
- スクリプトが実行され、「実行ログ」のビューに実行結果が出力されます。
以下の結果が出力されました。
019c36de-3954-73ea-92c9-2b01cf313816
タイムスタンプ抽出
UUIDv7は先頭12文字がUNIX時間のタイムスタンプです。
UNIX時間は協定世界時(UTC)の1970年1月1日午前0時0分0秒からの経過秒数です。
019c36de3954を10進数に変換すると1770447059284です。ミリ秒精度のため、1770447059.284になります。これを日本時間(UTC+9)に変換すると2026年02月07日15:50:59.284になります。
とはいえ、人間がUNIX時間の16進数を読んで把握することは困難です。
PostgreSQLではUUIDからタイムスタンプを抽出して返す関数も用意しています。
検索系SQL実行処理のSQL欄に上記で生成したUUIDを使った以下のSQL文を記載してスクリプトを実行します。
SELECT uuid_extract_timestamp('019c36de-3954-73ea-92c9-2b01cf313816'::uuid)
以下の結果が出力されました。
2026-02-07 15:50:59.284
uuidv7(interval)
uuidv7()関数は引数にinterval型を指定することもできます。interval型は期間を指定する型です。引数にinterval型を指定すると、その interval だけずらしたUUIDを生成します。
検索系SQL実行処理のSQL欄に以下のSQL文を記載してスクリプトを実行します。
SELECT uuidv7('1days');
以下の結果が出力されました。
019c3c11-93f4-7942-81c7-5ae5d407d4db
日付を抽出すると1日後になりました。
SELECT uuid_extract_timestamp('019c3c11-93f4-7942-81c7-5ae5d407d4db'::uuid)
以下の結果が出力されました。
2026-02-08 16:05:10.9
interval型には負数も指定できます。
SELECT uuidv7('-1months');
以下の結果が出力されました。
019b974f-dc65-7ef5-ad9e-b7b5c42229af
日付を抽出すると1月前です。
SELECT uuid_extract_timestamp('019b974f-dc65-7ef5-ad9e-b7b5c42229af'::uuid)
以下の結果が出力されました。
2026-01-07 16:15:52.037
引数に負のinterval型を指定することで100年前などUNIXエポック以前を指定できてしまいます。その場合でもUUIDは生成されますが、タイムスタンプ部分は不正です。PostgreSQLのソースコードには以下のコメントが記載されています。
NB: all numbers here are unsigned, unix_ts_ms cannot be negative per RFC.
UNIX時間が負数になるUNIXエポック以前は想定されておらず、動作保証外です。
UUIDv4との使い分け
PostgreSQLの過去バージョンではgen_random_uuid()関数でUUIDv4を生成しました。PostgreSQL 18ではuuidv4()がgen_random_uuid()のエイリアス(別名)となり、バージョンを意識して関数を呼び出せるようになりました。コードの意図が明確になり、可読性が向上します。
uuidv7(), uuidv4(), gen_random_uuid()の関数を実行してUUIDv7とUUIDv4を生成してみます。
検索系SQL実行処理のSQL欄に以下のSQL文を記載します。
select uuidv7(), uuidv4(), gen_random_uuid() from generate_series(1, 7);
このSELECT文は3列7行のデータを返します。
スクリプトのフローを以下のようにしてSELECT文の結果をCSVファイルに出力するようにします。
Start→検索系SQL実行処理→CSV書き込み処理→End
スクリプトを実行すると、以下のCSVファイルが出力されました。
uuidv7,uuidv4,gen_random_uuid
019c36fe-06fa-763c-98a7-7b0306d057ff,5a42b827-bfa3-4c5b-ac17-735a64c7eca7,9a662fb4-c21c-45d2-8fb2-b9691e0851ca
019c36fe-06fa-76b1-a358-6fb5b52e4398,e724b9ee-8aff-4cb1-853a-75063b0afc10,a4013c6e-f906-46b7-84b1-76f28bd0cc04
019c36fe-06fa-76c7-a717-4c5edc66a063,90943495-36d1-41b2-8666-3ac4361333c3,2d1a9508-f37b-49ca-8a5d-a1aebc708f50
019c36fe-06fa-76d1-afb1-3629f2d11301,63c6a924-5108-48a4-ac64-ea4069485e5a,9c12268b-93be-45de-8866-32b750b538dc
019c36fe-06fa-76e3-8809-0a654080c90f,3bfeda8a-996e-4e11-b6eb-8faa084526c0,8cf2b021-cfab-4b02-90dd-4c964f0758a7
019c36fe-06fa-76f2-b591-3a116e4f11fd,a74d1c4f-efe2-40cb-bf5c-22b91d1378e8,5e0dfdd3-3a53-4670-ae96-51f9b1ad5dc7
019c36fe-06fa-76fe-bd6b-e3975e0066a9,c6f2cb21-a0e6-4c10-96b5-7b775fa313ab,43ab53f5-5dee-41f5-af21-230fd767894e
UUIDv4はランダムな文字列ですが、UUIDv7は生成順に並びます。
UUIDv7は新しいバージョンですが、新しいものが常に古いものに勝るとは限りません。UUIDv7はタイムスタンプを持つことがアピールポイントですが、強みと弱みは表裏一体です。機密性の高いレコードではIDから生成時刻を把握されてしまうことが不都合なこともあります。その場合はUUIDv4が適しています。
特性に合わせてUUIDのバージョンを使い分けることが求められます。
| バージョン | データ種類 | 価値基準 |
|---|---|---|
| UUIDv4 | 秘匿性の高いデータ | IDから生成日時を推測されたくない |
| UUIDv7 | トランザクションやログなどの時系列データ | インデックス効率とデバッグ性を優先 |
単調増加
UUIDv7のタイムスタンプはミリ秒精度です。同一ミリ秒では順序が維持されないことになります。それでは困る場合のためにRFC 9562ではランダム文字列部分も単調増加させるデータとして利用することを認めています。
PostgreSQLのuuidv7()関数はRFC 9562の6.2「Monotonicity and Counters」で提案されたMethod 3「Replace Leftmost Random Bits with Increased Clock Precision」を採用しました。これによってタイムスタンプが同じ(同一ミリ秒に生成された)場合も、ランダムの文字列部分の値が単調増加するようになっており、順序を維持します。
上記UUIDv7出力結果のタイムスタンプ部分は全て「019c36fe-06fa」と同一ミリ秒です。タイムスタンプの直後の13文字目はバージョンであり、全て7です。その後にランダム値が格納されていますが、その値が単調増加しており、生成順になっています。
763c
76b1
76c7
76d1
76e3
76f2
76fe
まとめ
今回は、DataSpiderのJDBCアダプタを用いてPostgreSQL 18に接続し、以下を確認しました。
- 検索系SQL実行処理でuuidv7()関数を呼び出すことでUUIDv7を取得できること
- UUIDv7からタイムスタンプを抽出できること
- uuidv7(interval) により時間をずらしたUUIDを生成できること
- UUIDv7が同一ミリ秒内でも単調増加すること
DataSpiderでは汎用的なJDBCアダプタを利用することでメーカーがサポートしていないDBMSやバージョンとも接続できます。但し、JDBCアダプタはメーカーが特定の接続先をサポートしないものであるため、実運用では要件を踏まえた検証を推奨します。
We Are Hiring!


