Kullanılmayan dizinleri bırakmak - Beklenmeyen tehlikeleri değerlendirme


16

Sunucu, Temmuz ayında en son yeniden başlatıldığından beri biriken DMV istatistiklerine göre yüzlerce kullanılmayan dizine sahip çok büyük bir veritabanımız var. DBA'larımızdan biri, benim için anlamlı olmayan aşağıdaki uyarıcı ifadeleri yaptı:

  1. Bir dizini bırakmadan önce, sorgu optimizer'ın bu dizinin var olması gerekebileceğinden, benzersiz bir kısıtlama uygulamadığından emin olmamız gerekir.
  2. Bir dizin oluşturulduğunda, SQL Server'da bu dizinle ilgili istatistikler de oluşturulur. Bir sorgu dizini kullanmıyor olabilir, ancak istatistiklerini kullanıyor olabilir. Bu nedenle, bir dizine düştükten sonra belirli bir sorgu performansı gerçekten kötüleşir. SQL Server istatistiklerin kullanım istatistiklerini tutmaz. Veritabanımızda “Otomatik İstatistik Oluştur” özelliği etkin olmasına rağmen, sorgu optimize edici eksik istatistikleri oluşturmadan önce hangi parametrelerin dahili olarak karşılanması gerektiğini bilmiyorum.

# 1 ile ilgili olarak, SQL Server aslında bir ekleme / güncelleme yapılmadan önce benzersizliğini belirlemek için dizinde bir arama yapacak gibi görünüyor ve bu nedenle, dizin kullanılmıyor olarak göstermez.

# 2 ile ilgili olarak, bu gerçekten mümkün mü?

Bu arada, bir dizin kullanılmadığını söylediğimde, arama ve tarama yok demek istiyorum.


3
Yıl sonu raporlarında bile bu dizinin kullanılmadığından emin olduğunuzda dizini devre dışı bırakmanızı öneririm.
Kin Shah

Yanıtlar:


17

DBA'nızın endişeleri de geçerlidir.

# 1 ile ilgili olarak, SQL Server aslında bir ekleme / güncelleme yapılmadan önce benzersizliğini belirlemek için dizinde bir arama yapacak gibi görünüyor ve bu nedenle, dizin kullanılmıyor olarak göstermez.

Teklik garantisi, doğru sonuçlar elde etmek için hangi mantıksal dönüşümlerin veya fiziksel işlemlerin kullanılabileceğine karar vermede optimize edici tarafından kullanılabilir. Optimize edicinin, örneğin bir toplama dönüştürmek veya bire-bir birleştirme birleşimi seçmek için benzersiz bir garantiye dayanması, endekse fiziksel olarak nihai yürütme planında erişilmediği sürece dizin kullanım istatistiklerine yansıtılmayacaktır. . Bu nedenle, herhangi bir benzersiz dizini veya kısıtlamayı kaldırmak (veya devre dışı bırakmak) konusunda çok dikkatli olunmalıdır.

# 2 ile ilgili olarak, bu gerçekten mümkün mü?

Evet, optimize edicinin, bu dizini kullanan herhangi bir erişimi içeren son yürütme planı olmadan bir dizinle ilişkili istatistikleri kullanması mümkündür. 'İlginç' istatistiklerin yüklenmesi, kardinalite tahminlerinin hesaplanması ve tamamlanmış bir yürütme planının üretilmesi süreçleri oldukça bağımsız faaliyetlerdir.

Dizinin kaldırılması, ifadenin bir sonraki derlemesinde plan kalitesini etkileyebilecek ilişkili dizin istatistiklerini de kaldıracaktır. Endeks istatistikleri , endeksin nihai planda fiziksel olarak mevcut olmasa bile, nihai planın dayandığı bir kardinalite tahmin hesaplamasında kullanılabilir.

DBA'nız eşyalarını bilir.

Bunların hiçbiri, görünüşte kullanılmayan dizinlerin asla kaldırılmaması gerektiği anlamına gelmemelidir . Sadece DBA'nızın endişelerinin geçerli olduğunu söylüyorum ve değişikliği onlarla uygun testlerle ve bir kurtarma planıyla planlamalısınız. Deneyimlerime göre, # 1 noktasının # 2'den daha sorunlu olması muhtemeldir, ancak bunun durumunuz için geçerli olup olmadığını bilmem mümkün değil.

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.