En verimli UUID sütun türü nedir


15

128 bit UUID'yi depolamak için birden fazla depolama seçeneği vardır:

  1. bir bayt [16] sütunu
  2. iki bigint / long (64 bit) sütun
  3. bir CHAR (36) sütunu - 32 onaltılık basamak + 4 tire.
  4. db destekliyorsa UUID veritabanına özgü bir sütun

Endeksleme açısından bunlardan hangisi en verimli? Eğer db tahsis edilmiş bir uuid tipini desteklemiyorsa hangisi en iyi adaydır?


1
Bu biraz fazla "bağlıdır" - birçok uygulama özellikleri.
Craig Ringer

2
Asla 3 seçmezdim: 16'da yapılabildiğinde asla 36 baytta bir şey saklamam raw(16). Oracle ve uuidPostgreSQL'de kullanıyorum.
Colin 't Hart

1
ne kadar basit o kadar iyi.
akuzminsky

uuid>> bytea>> textile CHECKkısıtı> varchar(36)>> char(36). Bkz . Dba.stackexchange.com/a/89433/3684 ve dba.stackexchange.com/a/115316/3684 .
Erwin Brandstetter

Yanıtlar:


15

Özel bir uuidtür PostgreSQL için en iyi bahistir. Diğer DB'lerle söylemek zor - birisinin uuidbasit bir bayt türünden daha az verimli bir şekilde depolanan bir türe alışması imkansız değildir .

Yine PostgreSQL'de, byteatipiniz yoksa UUID'leri depolamanın makul bir yolu olurdu uuid. Diğer DB'ler için ikili verileri nasıl sakladıklarına bağlıdır.

Mümkün olduğunda, tire işaretli altıgen kullanmaktan kesinlikle kaçınırım. Karşılaştırmak, sıralamak ve depolamak çok daha az verimlidir.

Yani gerçekten, "değil (2) ya da (3)". Hiç. Desteklendiği yerlerde (4), aksi takdirde (1) kullanın.


Dikkat edilmesi gereken bir nokta, PostgreSQL UUID türünün dizilerde yerel olarak desteklenmediği veya bu düzeltildi mi? postgresql.org/message-id/…
Christophe Roussy

@ChristopheRoussy 2013'ten beri. Küçük bir gözetimdi. SELECT ARRAY['ef1e0638-072e-4caa-88b3-97bfa5b2e8c3']::uuid[]
Craig Ringer

3

Tercih sırasına göre: 4,1,2,3 SQL sunucusunu kullanıyorsanız UUID'leri kümeleme anahtarı olarak kullanmayın, çünkü yalnızca kötü bir şekilde parçalanmaz, kümeleme anahtarı tüm kümelenmemiş dizinlerde kullanılır ve bu baytları her dizin satırı. Parçalanma, NEWSEQUENTIALID kullanılarak hafifletilebilir, ancak genellikle diğer dizinlerde şişkinliği önlemek için Küme Anahtarınız için bir GUID üzerinden bir bingint kimliği tercih edilir.

2'den 1'i seçmek arasındaki fark, veritabanının tek bir sütun sabit dizisi üzerinde iki temel tür sütunu ne kadar verimli işlediğine bağlı olacaktır. Kukla verilerle test etmek yeterince kolay olmalıdır. Sorgularınızın hızına, dizinlerin ve verilerin boyutuna bakın. Küçük + hızlı en iyisidir!


1

Doğal olarak desteklenen herhangi bir veri türünün üründe o ürünün müşterisi olarak bir araya getirilebilecek her şeyden daha iyi optimize edileceği varsayılmalıdır. Bundan sonra, en küçük bayt sayısı ne olursa olsun, sayfa başına maksimum satır elde edersiniz.


Doğru, ama sadece önemli olan bayt boyutu mu? Tür, dizin oluşturma algoritmasını etkilemez mi?
Vlad Mihalcea

@Vlad SQL Server kullanıyorum. AFAIK, bir B ağacı (veya bellekte 2104 için bir karma indeksi) oluştururken tüm veri türleri aynı şekilde işlenir. Bunu olabildiğince dar tutmak için iyi nedenler var .
Michael Green
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.