15 poin oleh GN⁺ 2025-05-22 | 4 komentar | Bagikan ke WhatsApp
  • PostgreSQL 18 mendukung UUIDv7 secara bawaan, dan menyediakan pengenal unik yang dapat diurutkan serta ramah indeks
  • UUIDv7 mempertahankan keunikan dan keamanan di lingkungan terdistribusi dari UUID yang ada, sambil mengadopsi struktur pengurutan berbasis waktu yang menguntungkan bagi indeks btree
  • Dari kekurangan penggunaan UUID sebelumnya, yaitu tidak bisa diurutkan, indeks yang berantakan, dan ukuran memori, UUIDv7 menyelesaikan dua masalah pertama dan mewujudkan pengurutan berdasarkan waktu serta optimasi penyisipan
  • Di PostgreSQL 18, UUID dapat dibuat dengan fungsi uuidv7(), dan juga tersedia fitur ekstraksi timestamp serta input waktu kustom
  • Kini alasan untuk ragu menggunakan UUID sebagai primary key telah teratasi, sehingga menjadi pilihan yang lebih cocok untuk sistem terdistribusi dan lingkungan multi-tenant

PostgreSQL 18

  • Versi beta PostgreSQL 18 telah dirilis, dan pengujian sedang berlangsung dengan target rilis resmi pada bulan September
  • Fitur utama:
    • Async I/O: I/O asinkron berbasis io_uring meningkatkan kecepatan sequence scan dan vacuum hingga 2~3 kali
    • Skip scan pada indeks btree multi-kolom, optimasi kueri OR/IN
    • Mempertahankan statistik planner antar-upgrade
    • Fungsi UUIDv7
    • Kolom terhitung virtual, login OAuth, penambahan informasi I/O/CPU/WAL pada EXPLAIN, dan lain-lain

Kelebihan UUID

  • Dapat membuat ID unik di lingkungan terdistribusi
  • Keamanan diperkuat dengan pengenal publik yang tidak dapat diprediksi
  • Dapat membuat ID langsung di klien sehingga meminimalkan komunikasi dengan server

Kekurangan UUID lama

  • Tidak dapat diurutkan
  • Penurunan performa penyisipan akibat ketidaklokalan indeks
  • Overhead akibat ukuran 128-bit

Solusi dari UUIDv7

  • Versi UUID baru yang diperkenalkan sesuai RFC 9562 (diumumkan pada Mei 2024)
  • 48 bit pertama berisi timestamp berbasis Unix Epoch, sisanya menggabungkan nilai acak + penghitung
  • Dapat diurutkan berdasarkan waktu, dan meningkatkan efisiensi penyisipan indeks
  • UUIDv6 untuk kompatibilitas mundur, UUIDv8 untuk eksperimen/ekstensi vendor
  • Hanya UUIDv7 yang secara praktis merupakan standar baru yang benar-benar bermakna

Penggunaan UUIDv7 di PostgreSQL 18

  • Membuat UUID berbasis waktu saat ini dengan fungsi uuidv7()
  • Melalui uuidv7(INTERVAL), offset waktu yang diinginkan dapat diterapkan
  • Dengan fungsi uuid_extract_version() dan uuid_extract_timestamp(), versi UUID serta waktu pembuatannya dapat diekstrak
  • Contoh:
    CREATE TABLE test (  
        id uuid DEFAULT uuidv7() PRIMARY KEY,  
        name text  
    );  
    
    INSERT INTO test (name) VALUES ('foo');  
    INSERT INTO test (name) VALUES ('bar');  
    INSERT INTO test (id, name) VALUES (uuidv7(INTERVAL '-1 hour'), 'oldest');  
    
    SELECT uuid_extract_timestamp(id), name FROM test ORDER BY id;  
    
  • uuidv4() ditambahkan sebagai alias untuk gen_random_uuid()

Kesimpulan dan rekomendasi

  • UUIDv7 cocok bagi pengguna yang sebelumnya mengalami masalah performa saat memakai UUID
  • Sambil mempertahankan kelebihan UUID, ia juga memastikan kemampuan pengurutan dan performa indeks
  • Sudah bisa diuji sekarang juga di PostgreSQL 18 beta
  • Pilihan yang cocok untuk pembuatan ID di sistem terdistribusi, aplikasi multi-tenant, dan lingkungan serverless
    > “UUIDv7 adalah penambahan fitur yang tenang namun kuat, yang membuat kita mempertimbangkan kembali penggunaan UUID sebagai primary key di Postgres”

4 komentar

 
jaylee 2025-05-23

Saya menggunakan Prisma + ULID sebagai gantinya. Jauh lebih pendek dan lebih bagus.

 
ssssut 2025-05-22

Saya sudah membuat dan menggunakan fungsi seperti uuid_generate_v7(), jadi ini kabar yang menyenangkan.

 
stomx 2025-05-22

Oh!!

 
halfenif 2025-05-22

Oh...!