PostgreSQL bit dizesini kullanmalı mıyım?


18

bit stringSon zamanlarda veri türünü öğreniyorum ve oldukça merak ediyorum:

  1. Bu doküman sayfasının altında cümle var:

    ... artı ipin uzunluğuna bağlı olarak 5 veya 8 bayt ek yük

  2. PHP, Java, C #, C ++, vb. Diğer dillerde bit dizeleri Npgsql, ODBC, vb. Sürücüler aracılığıyla nasıl ele alınır?

Soru # 1 için, smallint veya bigint kullanmak çok daha verimli depolama alanı olacaktır ve tamsayılar her yerde desteklendiğinden belki de bir performans kazancı sunacaktır. Çoğu programlama dili, tamsayılardaki bit işlemlerini kolaylıkla işler. Bu durumda, bit-string veri türünü tanıtmanın anlamı nedir? Sadece çok miktarda bit maskesine ihtiyaç duyan vakalar için mi? Bit alanı indeksleme belki? PostgreSQL'de bit alan indekslemesinin nasıl yapıldığını merak ediyorum.

# 2 için kafam karıştı, meraktan daha fazlası. Örneğin, hafta içi bit maskelerini bir bit (7) alanında, bir gün için bir bit, en düşük bit Pazartesi'yi temsil edecek şekilde depolarsam. Sonra PHP ve C ++ değeri için sorgu. Ne elde edeceğim? Belgeler, biraz dize olacağımı söylüyor, ancak biraz dize, tamsayılarda olduğu gibi doğrudan kullanabileceğim bir şey değil. O zaman bu durumda, bit alanından vazgeçmeli miyim?

Herkes neden veya ne zaman biraz veya biraz değişken kullanmam gerektiğini açıklayabilir mi?



2
Erwin'in SO'ya cevabı harika (ve @Erwin üzerinden kopyalamayı sakıncası yoksa, burada olması yararlı olacaktır), ancak kendi dikkatimi eklemek istiyorum: çoğu durumda bilgi depolamayı düşünmezsiniz RDBMS'deki bit dizelerinde - depolama 'verimliliği' ne bakılmaksızın normal çözümde ayrı boole sütunları kullanarak.
Jack diyor ki topanswers.xyz

@JackDouglas: Cevabımı kopyalamakta sorun olmaz. Yine de merak ediyorum: SE siteleri arasında bir cevap çoğaltmak iyi bir fikir mi?
Erwin Brandstetter

@Erwin neden görmüyorum - siteler arasında bazı çakışmalar var ve her ikisinin de tek başına durması gerekiyor (örneğin, biz yapmazdık - ve yine de yapamadık), burada bir soruyu kopya olarak kapattı SO ile aynı soru. Odak noktamız 'uzman' konulara daha fazla, ancak IMO cevabınız şu anda bu kategoriye uyuyor :)
Jack diyor ki topanswers.xyz

@JackDouglas: Mantıklı. Ve yine de içeri girdiğiniz övgüden sonra nasıl katılmıyorum? ;)
Erwin Brandstetter 28:12

Yanıtlar:


18

Yalnızca birkaç değişkeniniz varsa ayrı booleansütunlar tutmayı düşünürüm.

  • İndeksleme kolaydır. Özellikle, ifadeler üzerindeki dizinler kolaydır.
  • Sorgu koşulları ve kısmi indeksleme için yazma ve okuma kolay ve anlamlıdır.
  • Bir boole sütunu 1 bayt kaplar. Sadece birkaç değişken için bu en az yer kaplar.
  • Diğer seçeneklerin aksine, boole sütunları NULL, ihtiyacınız olması durumunda ayrı bitler için değerlere izin verir . İstemiyorsanız sütunları her zaman tanımlayabilirsiniz NOT NULL.

Depolamayı optimize etme

Bir elden fazla tam değişkeniniz varsa ancak 33'ten azsanız, bir integersütun size en iyi hizmeti verebilir . (Veya bigint64 değişkene kadar a .)

  • Diskte 4 bayt yer kaplar.
  • Tam eşleşmeler için çok hızlı indeksleme ( =operatör).
  • Bireysel değerlerin işlenmesi bit stringveya ile olduğundan daha yavaş / daha az uygun olabilir boolean.

Hatta daha fazla değişken ile, ya da çok değer verir, yoksa büyük tablolar ve disk alanı yoksa / RAM hiçbir sorun, ya da sen almak ne emin değilseniz, ben dikkate alacağını işlemek istiyorsanız bit(n)yabit varying(n) .

Örnekler

Sadece 3 bit bilgi için, tek tek booleansütunlar 3 bayt, integer4 bayt ve bit string6 bayt (5 + 1) gerektirir.

İçin 32 bit bilgi, bir integerhala, 4 bayt gerekmektedir bit stringaynı (5 + 4) 9 bayt kaplar ve booleansütun 32 bayt işgal eder.

daha fazla okuma


Evet sana katılıyorum. Şu anda hafta içi bit maskesini saklamak için samllint kullanıyorum. Depolama verimliliğine / performansına geniş ölçüde uygundur. Ancak, bit maskelerinde biraz daha endeksleme / filtreleme yaparsam, düşük performans nedeniyle başarısız olur.
Jackey Cheung

3

Tüm PostgreSQL türleri bazı şeyler için yararlıdır ve diğerleri için daha az yararlıdır. Genel olarak, önce işlevsellik ve daha sonra performans konusunda endişe duyuyorsunuz. PostgreSQL, çeşitli veri türlerini işlemek için çok sayıda fonksiyona sahiptir ve bunlar bir istisna değildir.

Ben db sürücüsü tür dönüştürme yoluyla bir tür işlemez sürece, uygulama katmanı beklenir, bir dize temsil almak ve bu işlemek zorunda. Dolayısıyla bu kapasitede yararlı olabilir veya olmayabilir.

Yararlı olabileceği yer, bitsel veya bitsel gibi bitsel işlemlere dayalı kayıtları seçmek veya SQL sorgularındaki verileri başka bir şekilde değiştirmek istediğiniz zamandır. Bunu yapmadığınız sürece, PostgreSQL'in daha ezoterik özelliklerinin birçoğu daha az yardımcı olur.

Daha uzun ikili bilgi dizeleri için, akış vb. Yapmanıza izin veren büyük bir nesne arabirimi ve daha kompakt bir dize gösterimi sağlayan bir bayt arabirimi olduğunu unutmayın.

tl; dr: İhtiyacınız olursa bileceksiniz. Aksi takdirde zihninizin "ileride kullanılmak üzere ayrılmıştır" bölümünde dosyalayın.

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.