Postgres'te bir UUID'yi nasıl indekslemeliyim?


26

PostgreSQL'de yeniyim ve genel olarak veritabanlarında biraz yeniyim. Postgres'te UUID değerlerini endekslememizin sağlam bir yolu var mı ? Otomatik olarak kullandığı dahili bir şey olmadığı sürece, karma kullanarak ve bir trie kullanarak arasında bölünürüm. Ne kullanırsam kullanırım, büyük miktarda veriyi kullanmak olacak.

SP-GiST operatör ailesi "text_ops" bir trie kullanarak endeksler. UUID'ler oldukça uzun ve birbirinden farklı olduğu için, bu sesler sadece tam eşleşme aramaları yapsam bile çekici.

Bir de karma seçenek var. Hashing O (1) ve elbette eşitlik dışında herhangi bir karşılaştırma yapmam gerekmeyecek, ancak UUID'ler oldukça uzun olduğu için onlardan karma üretmenin çok fazla zaman harcayacağından korkuyorum.

Yoksa bu sisteme çok fazla bağlı olan ve özellikleri kullanan bir şey mi?

Çoğu durumda bigserial kullanmak isterdim , ancak bunun için uuid kullanmam söylendi . Uuid'e ihtiyacımız var, çünkü farklı veritabanları kullanan birden fazla sunucumuz olabilir, bu yüzden benzersiz sonuçlara sahip olacağımızın garantisi yoktur. Her sunucu için farklı bir dizi (ve tohum) kullanabiliriz, ancak yine de UUID'ler kadar esnek değildir. Örneğin, ID'leri ve referanslarını her yere dönüştürmeden veritabanı girişlerini bir sunucudan diğerine taşıyamazdık.


2
"Federal veritabanı" nın durumunuz için kullanılan bir kelime olduğuna inanıyorum . Ve evet, UUID'ler bunun için çözümdür. UUID'lerin onlarca yıl önce icat edilmesinin nedeni buydu: merkezi koordinasyon olmadan dağıtık sistemler arasında veri paylaşımı için.
Basil Bourque

Aylar sonra: Gerçekten de, "federasyon veritabanı" Basil Bourque getirdi. Sadece birden fazla sunucuya sahip değil, aynı zamanda çevrimdışı iken de kimlik oluşturan müşterilerimiz (federasyon DB'nin daha fazla parçası olarak düşünülebilir) var. Bu yüzden UUID kullanıyoruz.
sudo

Yanıtlar:


31

Kullanım PostgreSQL dahili oluyor uuidveri türü ve oluşturmak üzerine düzenli b- ağaç indeksi.

Özel bir şey yapmaya gerek yok. Bu, optimum bir endeksle sonuçlanacak ve aynı zamanda uuidalanı, halihazırda pratik olduğu kadar kompakt bir biçimde de depolayacaktır .

(PostgreSQL'in 10. versiyondan önceki karma indeksleri çarpışma emniyetli değildi ve bir b-ağacından daha iyi performans gösteremeyen gerçekten de tarihsel bir kalıntıydı. Onlardan kaçının. PostgreSQL 10'da çarpışma güvenli hale getirildi ve performans iyileştirmeleri yapıldı, böylece bunları göz önünde bulundurmak isteyebilirsiniz.)

Herhangi bir nedenden ötürü uuidtürü kullanamazsanız, genellikle metin gösterimi veya tercihen byteauuidin bir gösterimi üzerinde bir b-ağacı yaratırsınız.


2
hashEndekslere karşı yapılan açıklama b-treeyaygın bir inanç olmakla birlikte, böyle bir iddia için kaynak gösterilmesinin faydalı olacağını düşünüyorum.
Volte

1
PostgreSQL 10'dan itibaren, hashendeksler artık çökmeye karşı güvenli. Bununla birlikte, hashendeksler yalnızca birlikte kullanılabilir =, bu nedenle başka bir operatöre ihtiyacınız varsa b-tree, yine de tercih edilebilir.
rintaun

1
Birkaç yıl sonra, benim tecrübeme hashgöre b-tree, Postgres 10'da bile çok daha hızlı olmamıştı . Ancak karma indeksler b-tree'den çok daha az disk alanı kapladığından, büyük endekslerin büyük olduğu endekslerin olduğu bir kurulumda daha hızlı olabilir. Benim için durum böyle olmadığına inanıyorum. Onları şimdi v10'da güvenle kullanabileceğime dikkat edeceğim.
sudo

V10 ve v11'deki karma endeks performansında bazı iyi yazmalar var: rhaas.blogspot.com/2017/09/… - amitkapila16.blogspot.com/2017/03/…
Glenn Morton

3

PostgreSQL'de karma dizinler eylemde yok. PostgreSQL, hash endekslerine ihtiyaç duyduğunu ve hash endeks kodunun eski ve küflü olduğunu bilir, ancak birisinin gelmesini ve karma endekslemeyi elden geçirmelerini bekledikleri için kaldırmazlar. Bu konuya bakınız:

http://www.postgresql.org/message-id/4407.1115698257@sss.pgh.pa.us


Evet, bir karma endeksi kullanmaya çalıştığımda bir uyarı alıyorum. "Son derece cesareti kırılmış" veya başka bir şey.
sudo

Karma dizinler bazı durumlarda PostgreSQL'de iyi çalışır, ancak geçenlerde yerleşik UUID veri türü birincil ve yabancı anahtarlarındaki karma dizinlerle optimizasyon yapmaya çalıştığımda sorgularımın sonuç vermemesini sağladım. Yalnızca tüm veri türleri için çalışıyorlarsa ve PostgreSQL geliştiricileri bunu biliyorsa, sadece kendileri düzeltmek için çok tembeller ve kodlarını sonunda sanki için dua ediyor / sanki yerlerinde tutuyorlarsa, hash endekslerinin faydaları var. kurtarıcı.
derekm

2
Birisi karma dizinlerini kurtardı, tahmin ediyorum çünkü Pg10'un odaklandığı veri bölümlemesinde kritik bir rol oynuyorlar: wiki.postgresql.org/wiki/… Ama yine de size teorik olarak gördüğüm her şeyi vermiyorlar üniversite veritabanı sınıfında yararlı;)
sudo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.