- PostgreSQL 18, UUIDv7 için yerleşik destek sunuyor ve sıralanabilir, indeks dostu benzersiz tanımlayıcılar sağlıyor
- UUIDv7, mevcut UUID'lerin dağıtık ortamlarda benzersizlik ve güvenlik özelliklerini korurken, btree indeksleri için avantajlı zaman tabanlı bir sıralama yapısı benimsiyor
- Mevcut UUID kullanımının dezavantajları olan sıralanamama, indeks dağınıklığı, bellek boyutu sorunlarından ilk ikisini çözüp zaman sıralı düzenleme ve ekleme optimizasyonu sağlıyor
- PostgreSQL 18'de
uuidv7() fonksiyonuyla UUID üretilebiliyor; ayrıca timestamp çıkarma ve özel zaman girişi özellikleri de sunuluyor
- Böylece UUID'yi birincil anahtar olarak kullanma konusundaki tereddütlerin nedenleri büyük ölçüde ortadan kalkıyor ve UUID, dağıtık sistemler ile çok kiracılı ortamlarda daha uygun bir seçenek haline geliyor
PostgreSQL 18
- PostgreSQL 18'in beta sürümü yayımlandı ve Eylül ayındaki resmi sürüm hedefiyle testler sürüyor
- Başlıca özellikler:
- Async I/O:
io_uring tabanlı asenkron giriş/çıkış ile sequence scan ve vacuum işlemlerinde 2~3 kat hız artışı
- Çok sütunlu btree indekslerinde Skip scan,
OR/IN sorgu optimizasyonu
- Yükseltmeler arasında planner istatistiklerinin korunması
- UUIDv7 fonksiyonu
- Sanal üretilmiş sütunlar, OAuth oturumu açma, EXPLAIN'e I/O/CPU/WAL bilgisi eklenmesi vb.
UUID'nin avantajları
- Dağıtık ortamlarda benzersiz kimlik üretimi mümkün
- Tahmin edilemeyen herkese açık tanımlayıcılar ile daha güçlü güvenlik
- İstemcide doğrudan kimlik üretimi sayesinde sunucu iletişimini en aza indirme
Mevcut UUID'nin dezavantajları
- Sıralanamaz
- İndeks yerelliğinin olmaması nedeniyle ekleme performansında düşüş
- 128 bit boyutun getirdiği ek yük
UUIDv7'nin çözümü
- RFC 9562'ye (Mayıs 2024'te yayımlandı) göre tanıtılan yeni UUID sürümü
- İlk 48 bitte Unix Epoch tabanlı timestamp, kalan kısımda ise rastgele değer + sayaç birleşimi bulunuyor
- Zaman sıralı olarak dizilebiliyor ve indeks ekleme verimliliğini artırıyor
- UUIDv6 geriye dönük uyumluluk için, UUIDv8 ise deneysel/vendor genişletmeleri için
- Pratikte anlamlı olan tek yeni standart UUIDv7
PostgreSQL 18'de UUIDv7 kullanımı
uuidv7() fonksiyonuyla geçerli zamana dayalı UUID üretimi
uuidv7(INTERVAL) ile istenen zaman offset'inin uygulanması
uuid_extract_version(), uuid_extract_timestamp() fonksiyonlarıyla UUID sürümü ve üretim zamanının çıkarılması
- Örnek:
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(), gen_random_uuid() için bir takma ad olarak eklendi
Sonuç ve öneriler
- UUIDv7, mevcut UUID kullanımında performans sorunları yaşayan kullanıcılar için uygun
- Sıralanabilirlik ve indeks performansı sağlarken UUID'nin avantajlarını koruyor
- PostgreSQL 18 beta sürümünde hemen test edilebilir
- Dağıtık sistemler, çok kiracılı uygulamalar ve sunucusuz ortamlarda kimlik üretimi için uygun bir seçenek
> “UUIDv7, sessiz ama güçlü bir özellik eklemesi; Postgres'te UUID'yi birincil anahtar olarak kullanmayı yeniden düşünmeye değer kılıyor”
4 yorum
Ben bunun yerine Prisma + ULID kullanıyorum. Çok daha kısa ve daha iyi.
uuid_generate_v7()gibi bir fonksiyon oluşturup kullanıyordum; bu sevindirici bir haber.Vay!!
O...!