0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DataSpiderからPostgreSQL 18に接続してUUIDv7を生成してみた

0
Last updated at Posted at 2026-03-04

はじめに

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は未サポートです。

エフティーアドニャンuuid

利用したソフトウェア

  • 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のパスワード

gr.png

  • 「接続テスト」ボタンをクリックし、接続テストを実施します。「接続に成功しました」と表示されたら成功です。
  • 「完了」をクリックします。

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文を記載します。
SQL
SELECT uuidv7();

exec_select.png

  • 「抽出テスト」をクリックし、成功を確認します。
    ※不正な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文を記載してスクリプトを実行します。

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文を記載してスクリプトを実行します。

SQL
SELECT uuidv7('1days');

以下の結果が出力されました。

実行結果
019c3c11-93f4-7942-81c7-5ae5d407d4db

日付を抽出すると1日後になりました。

SQL
SELECT uuid_extract_timestamp('019c3c11-93f4-7942-81c7-5ae5d407d4db'::uuid)

以下の結果が出力されました。

実行結果
2026-02-08 16:05:10.9

interval型には負数も指定できます。

SQL
SELECT uuidv7('-1months');

以下の結果が出力されました。

実行結果
019b974f-dc65-7ef5-ad9e-b7b5c42229af

日付を抽出すると1月前です。

SQL
SELECT uuid_extract_timestamp('019b974f-dc65-7ef5-ad9e-b7b5c42229af'::uuid)

以下の結果が出力されました。

実行結果
2026-01-07 16:15:52.037

引数に負のinterval型を指定することで100年前などUNIXエポック以前を指定できてしまいます。その場合でもUUIDは生成されますが、タイムスタンプ部分は不正です。PostgreSQLのソースコードには以下のコメントが記載されています。

uuid.c
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文を記載します。

SQL
select uuidv7(), uuidv4(), gen_random_uuid() from generate_series(1, 7);

このSELECT文は3列7行のデータを返します。
スクリプトのフローを以下のようにしてSELECT文の結果をCSVファイルに出力するようにします。
Start→検索系SQL実行処理→CSV書き込み処理→End

スクリプトを実行すると、以下のCSVファイルが出力されました。

out.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です。その後にランダム値が格納されていますが、その値が単調増加しており、生成順になっています。

out.csv
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!

0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?