コンテンツにスキップ
Dev Classmethod Jp Articles Postgresql UUID V4 V7 Performance Index Fra 5e3c46e5

【PostgreSQL】UUIDv4とv7のパフォーマンスとインデックス断片化を比較する

  • URL: https://dev.classmethod.jp/articles/postgresql-uuid-v4-v7-performance-index-fragmentation
  • 日付: 2026-06-24
  • Tier: Tier 2
  • 要旨: PostgreSQL でテーブル主キーに UUID を使う場合、UUIDv4(完全ランダム)と v7(タイムスタンプ+時系列順)のパフォーマンス差は顕著。v4 は B-Tree インデックス挿入時にランダム位置への挿入となるため、ページ分割が頻発し、100 万件後の追加 INSERT パフォーマンスで v4 が v7 の 3~5 倍遅い(100 件投入:v4 0.04s vs v7 0.008s)。ストレージでも v4 は v7 より 16MB 多く(200MB vs 184MB)、インデックス断片化が顕著(avg_leaf_density v4 67.28 vs v7 89.99、leaf_fragmentation v4 49.69 vs v7 0.0)。UUID 型とテキスト型では UUID 型が効率的(テキスト:259MB vs UUID:184MB)。生成時刻推測がセキュリティリスクでなければ v7 推奨。

詳細

PostgreSQL では gen_random_uuid(v4)、PostgreSQL 18 で uuidv7 関数追加。ページ分割の仕組み:8KB ページ単位、ページ内満杯で新ページ追加・既存データ移動。v4 はランダム挿入位置で頻発、v7 は末尾付近挿入で低頻度。検証:users_v4(UUID 型+v4)、users_v7(UUID 型+v7)、users_v7_text(TEXT 型+v7)に 100 万件投入。追加 INSERT テスト:100 件(v4 0.04s/v7 0.008s)、1,000 件(v4 0.22s/v7 0.02s)、10,000 件(v4 0.6s/v7 0.15s)、10 万件(v4 2.9s/v7 1.7s)。1,545,300 件後ストレージ:users_v4 total 200MB(table 137MB+index 62MB)、users_v7 total 184MB(table 137MB+index 47MB)、users_v7_text total 259MB(table 172MB+index 87MB)。pgstattuple 拡張で断片化確認。キャッシュ効率でも v7 優位(最近データ頻繁アクセス時にキャッシュヒット率向上)。