Boş sütunlar bir tabloda yer kaplar mı?


20

Çok temel bilgilerden tutan masam var. Sadece bir başlık ve birkaç tarih alanı. Orada denilen bir alan var comments varchar (4000) biz boş bırakın Çoğu zaman, ancak bazı zamanlar burada büyük bir veri miktarı girer. Bu gerçekten kötü bir tasarım mı? Yoksa bu sadece biraz verimsiz mi?

Bu sütun için ayrı bir tablo oluşturmanın daha iyi olacağını varsayardım.

not: bu sql server 2008

resim açıklamasını buraya girin


Geri bildiriminiz için teşekkürler herkese! Basit tutmaya ve sütunu masanın içinde tutmaya karar verdim, başka bir masanın içine koymadım. Ancak, SPARSE özelliğini SQL 2008'de kullandım, böylece alan hiç boşluk kullanmıyordu.

2
Sadece merak ediyorum, "çoğu zaman" nedir? Toplam kaç satır ve burada yüzde kaç değer var? Sadece kullanarak SPARSEve kullanarak herhangi bir alan / performans karşılaştırmaları yapmayı planlıyorsanız merak ediyorum SPARSE...
Aaron Bertrand

Yanıtlar:


9

Daha öngörülebilir performans için (ve sayfa başına yüksek satır varyasyonundan kaçınmak için), bu verileri ilgili bir tabloda depolamaya eğilimliyim - özellikle de zamanın sadece küçük bir yüzdesini dolduruyorsa ve özellikle de yalnızca bazı sorular. Bu değerin bulunduğu satırlar, NULLgenel giderlere katkıda bulunur, ancak bu minimumdur. Daha da önemlisi, bir sayfanın yalnızca iki satıra nasıl sığabileceği ve bir sonraki sayfanın 500 satıra sığabileceği olacaktır - bu gerçekten istatistikleri etkileyebilir ve ayrı olarak saklanması ve üzerindeki tüm işlemlerinizi etkilememesi için bunu ayırmaktan daha iyi olabilirsiniz. çekirdek tablo.


12

Kullanılmadığında minimum yer kaplar

  • NULL bitmapteki bir bit
  • uzunluk için iki bayt (NULL olduğunda sıfır olacaktır)

Genel gider minimumdur ve optimizasyon erken olacaktır.

Bir sorununuz olduğunu bilinceye kadar, tek bir tabloda saklayın. KISS'i dış birleşimleri tanıtarak koparır ve verileri sorgulamak için bir ek yük eklersiniz.

Daha fazla bilgi için bkz. Https://stackoverflow.com/questions/3793022/how-to-come-to-limits-of-8060-bytes-per-row-and-8000-per-varchar-nvarchar-valu/3793265#3793265


10

Özellikle o alanı her zaman doldurmazsanız, sayfa yoğunluğunu iyileştirmek ve parçalanmayı azaltmak için ayrı bir tablonun daha iyi olacağını düşünüyorum.

  • Bir veri sayfası yaklaşık 8000 bayt tutar
  • 100 baytlık bazı satırlarınız ve 4000 baytın üzerinde bazı satırlarınız var
  • Bu uzun satırlar kendi başlarına bir sayfada olacak ve sayfanın geri kalanı DB'nizin kapladığı ancak boşuna veri tutamayacağı "boşa" alandır
  • Çoğunlukla dolu bir sayfadaki bir kayıt için bu uzun alana veri eklerseniz, büyük olasılıkla sayfayı aşar ve kaydın geri kalanıyla sayfada bir işaretçi ile sonuçlanır.

Tüm bu boş sayfalar ve işaretçiler düşük performansa neden olur. Mümkünse bu alanı normalleştirin.


4

Bu soru çok benzer görünüyor: ekstra boş sütunlar sql tablo boyutunu önemli ölçüde etkiler mi?

Cevap evet gibi görünüyor, yer kaplıyor, ancak çok fazla boş değer içeren sütunlar için bir sıkıştırma algoritması var.

Tasarım açısından, buna bağlı bir harici tablonun olması daha temiz bir tasarım olacağını düşünüyorum. Sık null değerlere sahip bir sütuna sahip olmak, dikkatli olmadıkları takdirde yanlışlıkla boş değer kullanabildikleri için veritabanı kullanıcılarını zorlaştırır. Bu nedenle, veritabanını kullanan kod hata denetimi içermelidir ve oradan sadece çirkin olur.


2
Açıkça ifade etmek gerekirse, sıkıştırma algoritması yalnızca SPARSE"çok sayıda boş değerli sütunlar" için değil, yalnızca açıkça olarak tanımlanan sütunlar için geçerlidir .
Aaron Bertrand

2

İyi olacaksınız - zaten bir varchar sütunu, bu yüzden sadece veri içerdiğinde alan kullanıyor. İnt gibi çok sayıda boş değerli sabit boyutlu sütununuz varsa, alan kullanımı ile ilgili sorunlarınız olabilir.

Başka bir masaya koymak kadar, ben rahatsız olmaz. Ayrıca varchar (max) ve satır içi / dışı seçeneklerini de kullanabilirsiniz. Yine, muhtemelen erken.


1
Erken optimizasyon genellikle gerçek bir sorun olabilir, ancak bu daha sonra yeniden düzenleme maliyetine bağlıdır. Bugün satırlarınızın yalnızca% 1'inin bu sütunda veri olacağını biliyor ve tablonun zaman içinde büyümesini bekliyorsanız, mevcut tablodaki verilerin ölçeklendirildikçe yalnızca sonuçlara maruz kalmasına devam etmenin değeri nedir? Erken optimizasyondan kaçındığım için hepiyim, ancak bunu yapmanın uzun vadeli etkisini tarttığımda bir nokta var.
Aaron Bertrand

@Aaron Bertrand Kabul etti. İnsanlar burada performans soruları soruyorlar ve milyonlarca satır olan bir uygulamaya sahip olabileceklerini ve araç takımındaki her silahı kullanmaları ve bunları akılda tutmaları gerektiğini varsaymak kolaydır. Öte yandan, bazen kullanıcı bir öğrenme eğrisinin başlangıcında gibi görünür ve muhtemelen önceliklerinde daha düşük olması gereken bir şeye zaman ayırmalarını istemek zordur. Ayrıca, varchar (max) ile, sıra dışı depolamaya başlamak için bir düğmeye etkili bir şekilde basabilirsiniz. Bence buradaki gerçek cevap "Kesin bir cevap vermek için bize yeterince bilgi vermediniz".
Cade Roux
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.