2008-11-20 19 views
11

Diziler için seçilen sütunların satırlar arasında iyi ayrım yapması gerektiğini okudum, yani dizin sütunları aynı değere sahip çok sayıda satır içermemelidir. Bu, booleanların veya cinsiyet gibi bir enumun bir endeks için kötü bir seçenek olacağını öne sürecektir.Endekslerde boolean veya enum sütunlarını kullanma?

Kullanıcıları cinsiyete göre ve belirli bir veritabanında bulmak istediğimi söylüyorsam, kullanıcıların yalnızca% 2'si kadındır, o zaman bu durumda cinsiyet sütunu, kadın kullanıcıları alırken yararlı bir dizin gibi görünür ancak tüm erkek kullanıcıları alırken değil.

Böyle bir sütuna bir indeks koymak genellikle iyi bir fikir olabilir mi?

cevap

1

Bu, sunucu istatistiklerinin dizini ne zaman oluşturacağımı bildirmesine izin verdiğim bir durumdur. Bu sorgunun baskın olacağını veya böyle bir sorguyu çalıştırmanın performans hedeflerinizi karşılamayacağını bilmedikçe, dizini zamanından önce oluşturmak yalnızca performansı artırmak yerine performansa mal olabilir. Ayrıca, sorguyu gerçekten nasıl kullanacağınızı düşünmek isteyebilirsiniz. Bu durumda, tahminim, kriterleri karşılayan kullanıcıları seçmek yerine, tipik olarak bu sütuna dayalı olarak bir tür toplama gerçekleştirmenizdir. Bu durumda, yine de tablo taraması yapıyor olacaksınız ve dizin size herhangi bir şey satın almayacak.

3

Arama performansını iyileştirmek için düşük kardinalliğe sahip bir sütunu indeksleme, dünyamda yaygındır. Oracle, bu durumlar için tasarlanmış bir "bit eşlemli dizin" destekler. Kısa bir genel bakış için this article'a bakın.

Deneyimlerimin çoğu Oracle ile ilgilidir, ancak diğer RDBMS'lerin benzer bir şeyi desteklediğini varsayalım.

2

Ancak, muhtemelen sadece kadınların yaklaşık% 2'sini seçeceğinizi unutmayın. Zamanın geri kalanında, erkekleri arıyor olacaksın. Ve bunun için, düz bir tablo taraması (bir indeks taramasından ziyade, tablodan veriye erişmekten ziyade) daha hızlı olacaktır. Bazen, daha yüksek bir ana sütun ile (doğum tarihi, belki de) birleştirilmiş düşük bir ana sütun (enum, boole) içeren bir bileşik indeksi de kullanabilirsiniz. Bu, tam verilere ve gerçekten kullanacağınız sorgulara bağlıdır.

Tecrübem, erkek/kadın üzerindeki bir endeksin nadiren gerçekten yararlı olacağı yönündedir. Ve genel tavsiye geçerli. Hatırlanması gereken bir nokta daha - satır eklediğinizde veya kaldırdığınızda (veya güncellediğinizde) dizinlerin korunması gerekir. Daha fazla indeks, her işletmeyi değiştirmek için daha fazla çalışma yapmak zorunda, sistemi yavaşlatmak.

Dizin tasarımında bütün kitaplar var.

+0

Cevabınız iyidir, ancak cinsiyet yerine, sadece 100'ü bulan büyük şehirleri veya eyaletleri saklıyoruz, 1 milyon kullanıcı arasında dağıtılıyor, bu yüzden muhtemelen 10 bin kullanıcı aynı değere sahip olacak ve eğer sadece belirli bir şehir için, DB'nin 1 milyon satırı tekrarlamasını istemiyorum ve normal b + endeksi bu amaç için çok kötü olacak, bu nedenle bu durumda sizin öneriniz ne olacak? –

+0

@Akash: Diğer iki cevaba bakın - bir bitmap dizini uygun olabilir, ancak sorgularınızın ne olduğuna bağlıdır. Tek şehir için tüm 10.000 kullanıcıyı iade etmek mi istiyorsunuz? Yoksa bu çevreden kullanıcılar hakkında bazı istatistikler mi yapıyorsunuz? Veya ... –

+0

Cevabınız için teşekkürler, tek bir şehir içinde arama arıyorum, ama sahip olduğum sorun SQL server bitmap dizinine sahip değil, ben son SQL yeni özellikler görmedim emin değilim, umarım orada. –

İlgili konular