Projemiz çok büyük, çok karmaşık bir veritabanı yürütüyor. Yaklaşık bir ay önce, null değerleri içeren dizinlenmiş sütunlar tarafından kullanılan alanın çok fazla büyüdüğünü fark ettik. Buna bir yanıt olarak, null değerlerin% 1'inden fazlasını içeren tüm tek sütunlu dizinler arasında dinamik olarak arama yapacak komut dosyası olarak yazdım, daha sonra değerin NULL OLMAMASI koşulunda bu dizinleri filtrelenmiş dizinler olarak bırakın ve yeniden oluşturun. Bu, veritabanı boyunca yüzlerce dizini bırakır ve yeniden oluşturur ve genellikle tüm DB tarafından kullanılan alanın neredeyse% 15'ini boşaltır.
Şimdi bununla ilgili iki sorum var:
C) Filtrelenmiş dizinleri bu şekilde kullanmanın olumsuz yanları nelerdir? Yalnızca performansı artıracağını varsayıyorum, ancak performans riskleri var mı?
B) Daha sonra kontrol edildiğinde bile, her şey tam olarak beklendiği gibi gitmiş olsa bile, dizinleri bırakma ve yeniden oluşturma konusunda hatalar aldık ( 'XYZ indeksini bırakamıyorum ya da izniniz yok' ) aldık . Bu nasıl olabilir?
Herhangi bir yardım için teşekkürler!
Edit: @Thomas Kejser adlı kişiye yanıt olarak
Merhaba ve teşekkürler, ama bu bir felaket oldu. O zaman aşağıdaki gibi bazı şeyleri anlamadık:
- Bir sorgu sırasında SQLOS, tablo sütunlarına katılmak için NULL değerleri kullanamayacağını belirlemeden önce dizin planları yapar. IE, gerçekten sorguda kullanılan filtrelenmiş her dizin için dizin uyan bir WHERE yan tümcesi filtre olması gerekir, ya da dizin hiç kullanılmaz.
- Dizin bırakmak ve oluşturmak ve istatistiklerini daha sonra tekrar güncellemek yine de yapacaklarını varsaydığımız güncellenmiş planları üretmek için yeterli olmayabilir. Bazı durumlarda yalnızca yeterince yüksek bir iş yükü SQL Server'ı planları yeniden değerlendirmeye zorlar.
- Sadece sağduyu ve mantık ile belirlenmesi zor olan yürütme planlayıcısının işlevselliği için bazı ekzotikler vardır. Farklı sorguların binlerce koddan türetilen varyasyonu bile, görünüşte yararsız dizinler, kritik sorgularda kullanılan bazı istatistik ve sorgu planlarında yardımcı olabilir.
Sonunda, bu değişiklikler geri alındı. Dolayısıyla, filtrelenmiş dizinler güçlü bir araçtır, ancak bu sütunlardan hangi verilerin getirildiğini tam olarak anlamanız gerekir. Alan sorunlarının yanı sıra normal dizinlerin uygulanması oldukça kolay olduğunda, filtrelenmiş dizinler çok özelleştirilmiş çözümleri temsil eder. Kesinlikle normal bir endeksin yerine geçmezler, ihtiyaç duydukları bu özel durumlarda bir uzantısıdırlar.