IBM Support

[Db2] CURRENT_TIMESTANP 特殊レジスターが重複値を返すことがある

Question & Answer


Question

現在時刻 (CURRENT TIMESTAMP) をユニーク列に挿入すると、SQL0803N (重複キー・エラー) で失敗することがあります。 CURRENT TIMESTAMP は固有な値を返さないのでしょうか。

Cause

CURRENT TIMESTAMP が返す値は必ずしも固有値ではありません。

特に Db2 Windows 版は CURRENT TIMESTAMP のマイクロ秒部分を 000 でパディングしているため、重複値が返りやすくなっています。これは、Windows で現在時刻を戻す API (GetLocalTime) が SYSTEMTIME 構造体にミリ秒までの時刻しか定義していないためです。

Db2 はほぼ同時に現在時刻を取得した場合、マイクロ秒部分を 001, 002 のようにインクリメントする機構があります。しかし、マイクロ秒部分の重複を完全に防ぐことは保障されていません。
GetLocalTime function
SYSTEMTIME structure

注: Windows にマイクロ秒の精度で現在時刻を返す関数はありません。

Answer

マニュアルに記述されているように、Db2 の CURRENT TIMESTAMP は重複値を返す可能性があります。CURRENT TIMESTAMP が固有値を返す前提のアプリケーションは、以下のような手法で固有値に変換してください。
V9.1 の新機能: CURRENT TIMESTAMP 特殊レジスターが重複値を戻す


db2 "values (TIMESTAMP(GENERATE_UNIQUE()) + CURRENT TIMEZONE)"

注:
Oracle の データ・タイプ DATE の TIMESTAMP(0) への互換性が有効なデータベースでは、以下のように TIMESTAMP 関数の結果と CURRENT TIMEZONE を演算するために HOUR 関数などによる調整が必要です。

db2 "values (TIMESTAMP(GENERATE_UNIQUE()) - HOUR(CURRENT TIMEZONE) hours)"

運用上の考慮点
Db2 Linux/UNIX 版は gettimeofday 関数から現在時刻を取り出すため、マイクロ秒までの精度があります。
ただし、Linux/UNIX 版でも時刻が重複しないことは保障されていません。
NTP などで時刻を調整している場合、GENERATE_UNIQUE() を使っても時刻が重複する可能性があります。

関連情報
CURRENT TIMESTAMP function behaves differently between UNIX and Windows platforms.
 
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PmFAAU","label":"Operating System or Hardware-\u003EOS Configuration"},{"code":"a8m0z0000001gNyAAI","label":"Runtime"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
04 November 2023

UID

swg21579694