全部产品
Search
文档中心

PolarDB:sequential_uuid

更新时间:Jul 02, 2025

Ekstensi sequential_uuid dapat menghasilkan dua generator UUID berurutan untuk menyelesaikan masalah I/O acak yang disebabkan oleh generator UUID acak.

Prasyarat

Ekstensi ini didukung pada kluster PolarDB for PostgreSQL (Compatible with Oracle) yang menjalankan mesin berikut:

  • PolarDB for PostgreSQL (Compatible with Oracle) 2.0 (versi revisi 2.0.14.1.0 atau lebih baru).

  • PolarDB for PostgreSQL (Compatible with Oracle) 1.0 (versi revisi 1.1.28 atau lebih baru).

Catatan

Anda dapat mengeksekusi pernyataan berikut untuk melihat versi revisi dari kluster PolarDB for PostgreSQL (Compatible with Oracle):

SHOW polar_version;

Informasi latar belakang

Generator UUID acak menghasilkan nilai genap dalam rentang tertentu, sehingga halaman tempat semua indeks berada memiliki probabilitas yang sama untuk terkena dampak saat data dimasukkan ke dalam indeks. Hal ini menyebabkan semua indeks dipaksa masuk ke memori. Masalah ini tidak ada saat menggunakan indeks kecil, tetapi ketika ukuran indeks melebihi ukuran buffer bersama (atau RAM), laju hit cache turun dengan cepat.

Dibandingkan dengan UUID acak, UUID berbasis urutan atau berbasis timestamp bersifat berurutan. Data baru hampir selalu dimasukkan di sisi paling kanan indeks untuk meningkatkan laju hit cache. Nilai urutan baru lebih besar dari semua nilai sebelumnya dan memiliki timestamp yang sama. Hal ini juga berlaku untuk nilai timestamp.

Catatan
  • Generator UUID berurutan meningkatkan prediktabilitas UUID dan probabilitas tabrakan UUID lintas mesin.

  • Untuk informasi lebih lanjut tentang keuntungan UUID berurutan, lihat Sequential UUID Generators.

Ekstensi sequential_uuid terutama digunakan untuk membuat generator UUID yang lebih berurutan tanpa mengurangi keacakan secara signifikan. Keacakan rendah dapat meningkatkan probabilitas tabrakan dan prediktabilitas UUID.

Desain generator

Cara sederhana untuk menghasilkan UUID berurutan adalah dengan memberi awalan UUID dengan nilai berurutan. Misalnya, Anda dapat menggunakan urutan atau timestamp dan menambahkan data acak sampai keacakan UUID mencapai 16 B. UUID yang dihasilkan dengan cara ini bersifat kontinu, tetapi metode ini menyebabkan masalah berikut:

  • Keacakan rendah: Jika Anda menggunakan urutan yang menghasilkan nilai bigint, keacakan UUID yang dihasilkan berkurang dari 16 B menjadi 8 B. Timestamp mengurangi keacakan dengan cara serupa, tergantung pada presisi timestamp. Keacakan rendah meningkatkan probabilitas tabrakan dan prediktabilitas UUID. Sebagai contoh, Anda dapat menentukan UUID mana yang dihasilkan secara berdekatan, bahkan memprediksi timestamp mereka.

  • Pembengkakan: Jika nilai terus bertambah, indeks mungkin membengkak setelah data historis dihapus. Sebagai contoh, indeks timestamp dapat membengkak di tabel log.

Untuk menyelesaikan kedua masalah tersebut, generator yang diimplementasikan dirancang untuk berputar secara berkala, baik setelah menghasilkan sejumlah UUID tertentu atau setelah beberapa waktu. Dalam kedua kasus tersebut, UUID dihasilkan dalam satuan blok dan dalam bentuk berikut:

(ID Blok;Data Acak)

Ukuran ID blok bergantung pada jumlah blok dan tetap (tergantung pada parameter generator). Sebagai contoh, untuk blok dengan nilai default 64 KB, dua byte digunakan untuk menyimpan ID blok. ID blok bertambah secara berkala, dan akhirnya berputar kembali.

  • Generator UUID berurutan dapat menggunakan blok dengan 256 UUID. Rumus untuk menghitung ID blok dua byte:

    (nextval('s') / 256) % 65536
    Catatan
    • Generator berputar kembali ketika menghasilkan 16 M (256 × 65536) UUID.

    • Ukuran blok ditentukan oleh jumlah UUID yang dihasilkan.

  • Secara default, generator UUID berbasis timestamp menghasilkan blok 64 KB, yang konsisten dengan generator berurutan. Rumus untuk menghitung ID blok:

    (timestamp / 60) % 65536
    Catatan
    • Generator berputar kembali setiap 45 hari.

    • Ukuran blok didefinisikan sebagai interval. Nilai defaultnya adalah 60 detik.

Fungsi pembuatan UUID

Ekstensi sequential_uuid menyediakan dua fungsi yang menghasilkan generator UUID berurutan. Satu fungsi menggunakan urutan dan yang lainnya menggunakan timestamp.

  • Fungsi uuid_sequence_nextval menerima parameter berikut:

    • Objek tipe regclass (urutan).

    • Ukuran blok tipe integer (nilai default 65536).

    • Nomor blok tipe integer (nilai default 65536).

    Gunakan urutan untuk menghasilkan generator UUID berurutan:

    CREATE EXTENSION sequential_uuids;
    CREATE SEQUENCE s;
    SELECT uuid_sequence_nextval('s'::regclass, 256, 65536);

    Hasil contoh:

              uuid_sequence_nextval
    --------------------------------------
     00005547-8a67-452d-bdf7-b390f1edc49b
    (1 row)
  • Fungsi uuid_time_nextval menerima parameter berikut:

    • Interval waktu tipe integer (nilai default 60).

    • Nomor blok tipe integer (nilai default 65536).

    Gunakan timestamp untuk menghasilkan generator UUID berurutan:

    CREATE EXTENSION sequential_uuids;
    SELECT uuid_time_nextval(1, 256);

    Hasil contoh:

              uuid_time_nextval
    --------------------------------------
     08dac705-8776-4ce3-a45c-123fd65e11e8
    (1 row)
Catatan

Nilai default dari parameter di atas berlaku dalam sebagian besar skenario.