Bit sütununa dizin eklemek kesici uçları önemli ölçüde yavaşlatıyor mu?


11

Yaklaşık 1 milyon ila 5 milyon kayıt içeren bir masam var. Bu kayıtların küçük bir bölümünde bit sütunlarından biri 'TRUE' (DOĞRU) olarak ayarlanmış. Bu kayıtları hızlı bir şekilde bulmanız gerekiyor. Ben bu indeks bu sütun üzerinde arama hızlandırabilir düşünüyorum, ama INSERTs hakkında korkuyorum. Dolayısıyla sorum.

Veritabanı bir çeşit veri ambarı gibi çalışıyor, bu nedenle birçok SELECT ve küçük (günde 10-20'ye kadar) ama oldukça büyük INSERT'ler (aynı anda 200 bin kayıt) var. Ben veritabanına bu ithalat daha uzun süre korkuyorum.


5
SQL Server'ın hangi sürümü? Eğer 2008+ filtrelenmiş bir dizin gibi geliyorsa ihtiyacınız olan şey olabilir.
Martin Smith

SQL Server 2005
marioosh

1
Tabloyu bölebilirsiniz (tablonun yalnızca bir sütunu olan PK ile yeni bir tablo ekleyin, bu sütun yalnızca bit sütununun doğru olduğu satırlarla doldurulur - sonunda bit sütununu bile kaldırabilirsiniz.) görüş, 2005 yılında kısmi endeks eksikliği ile de işe yarayacaktır.
ypercubeᵀᴹ

Dizine Alınmış Görünüm ile dikkatli olun, günde 10-20 büyük kesici uca sahip olduğunuzdan bahsettiğiniz gibi, Dizine Alınmış görünümün bakımı performans kazancının avantajını aşabilir. Durumunuzu geliştirmek için kullanabileceğiniz herhangi bir "kutu özelliği" SQL 2005 sanmıyorum. ancak geçerli tablo yapısını ve mevcut dizini listelerseniz bazı alternatif tasarımlar bulabiliriz.
Anup Shah

Yanıtlar:


8

1 milyon kayıt için bir endeks işe yaramaz. Optimize edici bunu asla kullanmayacak, sadece bakımı için ödeme yapacaksınız. Çok daha iyi bir alternatif, bu biti kümelenmiş dizindeki en soldaki anahtar olarak eklemektir.

Ancak karanlıkta kör bir çekim yapacağım ve elinizde olan şeyin bir kuyruk deseni olduğunu tahmin edeceğim: kayıtlar, bitin 'TRUE' (yani 'TRUE') (yani 'needsprocessing = true') olarak ayarlandığı tabloda bırakılıyor ve ardından bir arka plan işlemi görünüyor bu kayıtlar için bazı işlemler yapar ve biti FALSE olarak günceller. Bu her yerde mevcut bir modeldir ve aynı zamanda sevgiyle 'performans felaketi tarif modeli' olarak da bilinir. Kayıtları tabloya bırakmayı ve bir bildirimi (yeni eklenen kayıt kimliği kadar basit olabilir) aynı anda bir kuyruğa bırakmanızı öneririm . Bkz . Tabloları Kuyruk Olarak Kullanma .


1
Yüksek Cardinalality kullanıcısı olan diğer filtre sütunlarını bilmediğimiz için bit sütununu en sol tarafa koyarak iyi bir nokta görmüyorum. şimdiye kadar BIT sütun kümelenmiş dizinde son seçim olduğunu gördüm. ancak evet, "Tabloyu Kuyruk Olarak Kullanma" adlı güzel referans için +1.
Anup Shah

2
Aslında bir test yaptım ve evet endeksi kullanacak. Bir tablo (Kimlik kimliği, myBit biti) oluşturun, bitin 0 ve 2000000'i bitin 1 olduğu 100 satır ekleyin. İstatistiklerin güncellendiğinden emin olun (gerekirse) ve myBit = 0 üzerinde bir sorgu çalıştırın ve dizin kullanılır.
Kenneth Fisher

@KennethFisher, TRUE / insert'in tipik yüksek hız örüntüsünde FALSE'a hemen eklenmesinin haricinde, istatistikler her zaman güncelliğini yitirecektir. Net bir tasarım yapmak yerine optimize edici ile Rus ruleti oynamayı tercih ederseniz, hak ettiğiniz şeyi elde edersiniz ...
Remus Rusanu

"asla asla kullanmayacağım" ifadesi vakaların% 99'unu tutar, ancak OP'nin hangi durumda olduğunu bilmiyoruz. Biraz başarılı bir şekilde dizine ekledim. Kullanım örnekleri mevcuttur.
usr

soru - cevap burada Dizin biraz alan (veya bazı dar aralık), yalnızca o değerle eşleşen satır sayısına göre çalışma kümesi azaltmak zaman"> spesifik olarak yanlış. Eğer varsa satır az sayıda eşleştirerek çalışma çok set azaltacaktır . 50/50 dağılımı ile satır sayısı çoksa, bugüne kadar endeksini uydurmak vs çok az performans kazancı satın alabilir." Bu durumda, kayıtların% 1'i ile eşleşen bir endeks, önemli bir artış için 1 milyonun% 99'unu tarama ihtiyacını ortadan kaldıracaktır?
drzaus

2

@MartinSmith'in söylediği gibi SQL 2008'e geçerseniz filtrelenmiş bir dizin mükemmel bir çözüm olacaktır. Ancak bu arada genel bir durum olarak HERHANGİ BİR eklenen dizin yükleme sürenizi artıracaktır. Küçük dizinler büyük dizinlerden daha azdır.

Bakabileceğim bir şey, değiştirilebilecek mevcut bir dizininiz varsa. Mevcut sorgularınızın belirli bir dizini kullandığını varsayarsak, o zaman bu dizinin sonuna bit sütunu eklemenin kesici uçlar üzerinde minimum etkisi ve sorgularınız üzerinde aradığınız olumlu etkisi olmalıdır.

Bakılacak bir sonraki şey, "Zaten çok fazla dizinim var mı?" "Çok" ne olduğuna dair zor ve hızlı bir kural yok ama gerçekten 10 endeks kuralı ile gitmek gerçekten GERÇEKTEN yeni bir gerek sürece sınırıdır.

Son düşünce, bir test örneğinde test edin. Birkaç milyon satır içeren bir tablo oluşturun, yükünüzü çalıştırın, endeksinizi ekleyin, ardından yükünüzü tekrar çalıştırın ve yükleme süresinde önemli bir artış fark edip etmediğinizi görün.

Gerçekten "önemli" ne olduğuna sadece siz karar verebilirsiniz. Yükleme süresine 5 dakika eklemenin "önemli" olduğu makinelerim var ve birkaç saatlik artışla güvenle görebileceğim diğerleri var.

DÜZENLE:

Başka bir seçenek de tablonuzu bölümlemektir. Enterprise sürümünü kullanmıyorsanız bölümlenmiş bir görünüm kullanmanız gerekebilir, ancak yine de yardımcı olacaktır. Bit 0'larınızı bir bölüme, bit 1'lerinizi başka bir bölüme koyarsınız. Yalnızca bir sürümü veya diğerini eklediğinizi varsayarsak, eklerinizi bile hızlandırabilirsiniz.

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.