Bir bayrak dizisini (bitmap / bit dizisi) depolamak için veri türü


15

Aşağıdaki işlemleri destekleyen bir tablonun her kayıt için bir bit dizisi depolamak gerekir:

  • Bir bitin ayarlanıp ayarlanmadığını test etme ve biraz ayarlama (SQL kullanarak)

  • ADO 2.8 (ADO.NET değil) kullanarak değeri sorgulama ve ayarlama

  • Dizin oluşturma ("kapsayan dizin" özelliğinden yararlanmak için)

Bu dizide saklanacak maksimum bit sayısı sabittir, ancak 32'yi aşabilir . Yani, basit bir int sütunu her zaman işe yaramaz.

Şimdiye kadar gördüğüm kadarıyla, seçeneklerim:

  1. Birkaç int sütunu kullanın
  2. Bigint kullanın (bit sayısı <= 64 olduğu sürece çalışır)
  3. İkili dosya kullan
  4. ?

İlk seçenek işe yarayacaktır, ancak verilere erişen kodda biraz yeniden düzenleme gerektirir. İkinci seçenek sadece geçici bir rahatlama ve şimdiye kadar yaptığım aramalardan ADO'nun bigint ile iyi çalışıp çalışmadığından emin değilim . İkili ile ilgili hiçbir deneyimim yok ve başka seçeneklerin farkında değilim.

Gereksinimler dikkate alındığında hangi veri türünü seçersiniz?

Yanıtlar:


12

Bunun için tek bir alan kullanmayacak kadar güçlü bir şekilde savunamıyorum .

Şu anda bir bigintbitmask alanı ile çok büyük bir veri kümesini korumakla ilgileniyorum ve biraz performans kabusu.

Tek bir biti kontrol ederseniz sorun yok. Birden fazla biti kontrol ederseniz performans çok hızlı bir şekilde düşer.

Bitmask tam sayılarının doğası nedeniyle, veri dağıtımı çok dengesiz olacak ve en düşük planları alacaksınız.

Birden fazla bit kontrolü, her satıra karşı çalışan bir işlevle aralık veya dizin taramalarıyla sonuçlanır. Bu bir karmaşa.

Benim geçici çözüm basitti - denetlenecek koşulların her biri için PK depolamak için bir tablo yaptım. Bu başlangıçta sezgiseldir, ancak gerekli alan düşüktür (yalnızca PK'yi depolarsınız) ve özellikle a kullanıyorsanız, aramalar hızlı bir şekilde yıldırım hızındadır UNIQUE CLUSTERED INDEX.

Ana tablonuzu etkilemeden istediğiniz sayıda koşul ekleyebilirsiniz ve güncellemeler ana tablonuzu etkilemez.

Tüm arama tablolarını tek tek dizine eklediğinizden ve kümelenmiş anahtarınız ana tablonuzda aynı olduğundan ve aramalarınız tüm değerlendirmelerinizin merge joinçok verimli olduğu için endeksleme basittir .


1
Geçici çözümünüz hakkında biraz daha ayrıntı verebilir misiniz? Bunu buldum çünkü aynı temel sorunu çözmeye çalışıyorum, ancak en iyi nasıl yapılacağından emin değilim.
Joshua Frank

4

Saklamanız gereken tek şey orta sayıda doğru / yanlış değerse, bitveri türünü kullanabilirsiniz .

Dahili olarak, SQL Server bitbayt "paket" içine paketlenmiş sütunları saklar . Böylece bittablonuzda 8 sütuna kadar SQL, paketlenmiş 1 bayt olarak depolar; bit2 baytta 9-16 sütun vb.

Sütun sınırına yaklaşacağınız gibi görünmüyor, bu yüzden bu oldukça basit görünüyor. Ve elbette, bunları güzel bir şekilde ayrı tutmak, sütunları okunabilirlik için adlandırmanıza ve normalde yapacağınız tüm indeksleme olanaklarına sahip olmanıza izin verir (bayraklar çok seçici ise, filtrelenmiş dizinler 2008+'yi hedefleyebiliyorsanız faydalı olabilir).

Bit paketlemesini kendiniz yapmak, endeksleme yapmayı çok daha kıvrımlı hale getirecektir (muhtemelen bitmaskenin her konumunu temsil etmek için hesaplanmış ve dizine alınmış sütunlar ... ancak daha sonra bitdoğrudan kullanmaya karşı daha kötüsünüz ).

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.