Dizin gerekli veya gerekli olup olmadığı nasıl belirlenir


110

MS SQL veritabanımızda bir otomatik indeks aracı çalıştırıyorum (indeks istatistik tablolarına bakan bir komut dosyasını değiştirdim - Otomatik Otomatik İndeksleme ). İstatistiklerden şimdi oluşturması gereken dizinler için bir önerilerim var.

Düzenleme: Yukarıda açıklanan Dizinler, eğer mevcutlarsa veritabanı motorunun dizinler için ne kullanacağını söyleyen DMV'lerden bilgi alır ve komut dosyaları En iyi x önerilerini alır (ister istemez, kullanıcı etkisi vb.) Ve bunları bir tabloya koyar.

(Yukarıdaki düzenlemeyi kısmen, komutların ne yaptığını netleştirmek için Larry Coleman'ın cevabından alınmıştır)

Veritabanı yöneticisinde yeniyim ve ağ üzerinde hızlı bir arama yaptığım için, dalma almak ve önerilen dizinleri kör bir şekilde eklemek konusunda isteksizim. Ancak, bu alanda tecrübe edilmemek için tavsiyelerin gerekli olup olmadığının nasıl belirleneceği konusunda bazı tavsiyeler arıyorum.

SQL Profiler'ı çalıştırmam gerekiyor mu yoksa tabloları sorgulayan kodu incelemek daha mı iyi? Başka tavsiyen var mı?



kullanılamaz indeksleri kontrol edin. Makale size yardımcı olabilir: sqlshack.com/…
Shiwangini Shishulkar

Yanıtlar:


80

Kullandığım Jason Strate indeksi analizi komut dosyalarını (Eski konum) . Mevcut indekslerinizin ne kadarının kullanıldığını ve ne kadar eksik indeks kullanılacağını söylerler. Genellikle bir tablodaki sorguların% 5 veya 10'undan fazlasını oluşturmadıkları sürece indeks eklemem.

En önemlisi de, uygulamanın kullanıcılar için yeterince hızlı yanıt vermesini sağlamak.

Güncelleme: Jason Strateji'nin yeni senaryolar için dizin analizi blog makaleleri (Yeni konum)

Çifte Güncelleme: Bugünlerde endeks analizi yaparken sp_BlitzIndex® kullanıyorum .


Tüm tabloları analiz etmek için hangi değişiklikleri yapmamız gerekiyor?
MonsterMMORPG

1
sp_BlitzIndex, belirli bir büyüklüğün üzerindeki tüm tablolara bakacaktır. Nasıl ayarlanacağını görmek için belgelere bakmanız gerekir.
Jeremiah Peschka

Sp_BlitzIndex'i yürütmek için parametreler buradadır: brentozar.com/blitzindex
JackArbiter

herhangi üçlü güncelleme?
Simon_Weaver

49

İndekslerle uğraşırken anlaşılması gereken birkaç kavram ve terim vardır. Arayışlar, taramalar ve aramalar, indekslerin select ifadeleriyle kullanılma yöntemlerinden bazılarıdır. Anahtar sütunların seçiciliği, bir endeksin ne kadar etkili olabileceğinin belirlenmesinde bir bütündür.

SQL Server Query Optimizer, istediğiniz verileri bulmanın en iyi yolunun bir dizin içindeki aralığı taramak olduğunu belirlediğinde, bir arama gerçekleşir. Aramalar tipik olarak, bir sorgu bir indeks tarafından "kapsandığında" olur, yani arama tahminleri indeks anahtarındadır ve görüntülenen sütunlar anahtar içerisinde veya dahil edilmiştir. SQL Server Query Optimizer, verileri bulmanın en iyi yolunun tüm dizini taramak ve sonuçları filtrelemek olduğunu belirlediğinde bir tarama gerçekleşir. Bir arama genellikle, bir dizin, dizin anahtarında veya dahil edilen sütunlarda istenen tüm sütunları içermediğinde gerçekleşir. Sorgu en iyi duruma getiricisi daha sonra istenen diğer sütunları "aramak" için kümelenmiş anahtarı (kümelenmiş bir dizine karşı) veya RID'yi (bir öbeye karşı) kullanır.

Tipik olarak, arama işlemleri fiziksel olarak daha küçük bir veri kümesini sorgulamak nedeniyle taramalardan daha etkilidir. Çok küçük bir ilk veri seti gibi, bunun böyle olmadığı durumlar vardır, ancak bu sorunuzun kapsamı dışında kalmaktadır.

Şimdi, bir endeksin ne kadar etkili olduğunu nasıl belirleyeceğinizi sordunuz ve akılda tutulması gereken birkaç şey var. Kümelenmiş bir dizinin anahtar sütunlarına kümeleme anahtarı denir. Bu, kümelenmiş bir dizin bağlamında kayıtların benzersiz hale getirilmesidir. Tüm kümelenmemiş dizinler, gerektiğinde arama yapmak için varsayılan olarak kümelenmiş anahtarı içerecektir. Tüm dizinler, ilgili her DML deyimi için eklenecek, güncellenecek veya silinecek. Bununla birlikte, belirli ifadelerdeki performans kazanımlarını ifadelerdeki ekleme, silme ve güncelleme performanslarına karşı dengelemek en iyisidir.

Bir dizinin ne kadar etkili olduğunu belirlemek için dizin tuşlarınızın seçiciliğini belirlemelisiniz. Seçicilik, toplam kayıtların farklı kayıtların yüzdesi olarak tanımlanabilir. 100 toplam kayda sahip bir [person] tablosu varsa ve [first_name] sütunu 90 farklı değer içeriyorsa, [first_name] sütununun% 90 seçici olduğunu söyleyebiliriz. Seçicilik ne kadar yüksek olursa, indeks tuşu o kadar verimli olur. Seçiciliği göz önünde bulundurarak, en seçici sütunlarınızı ilk önce dizin anahtarınıza koymak en iyisidir. Önceki [şahsiyet] örneğimi kullanarak,% 95 seçici bir [soyadı] sütunu olsaydı ne olurdu? İndeks anahtarı olarak [last_name], [first_name] ile bir dizin oluşturmak istiyoruz.

Bunun biraz uzun soluklu bir cevap olduğunu biliyorum, ancak bir endeksin ne kadar etkili olacağını belirleyen pek çok şey var ve performans kazanımlarını ölçmeniz gereken birçok şey var.


1
Sadece yukarıda söylenenleri vurgulamak istiyorum: Endeksler ekler / silme ve güncellemeleri yavaşlatır. Büyük miktarda veri toplu olarak eklemek zorundaysanız, dizin olmadan daha iyisinizdir (daha sonra oluşturabilirsiniz, daha hızlıdır).
Nicolas de Fontenay

[Last_name], [first_name] sütunlarındaki dizinin yalnızca sorgu son_adı ve ilk_adı filtrelemesi durumunda kullanılabileceğini belirtmek doğru olur mu? Yalnızca ilk_adı üzerinde filtreler olması durumunda, dizin kullanılamaz, değil mi?
Magier

İyi cevap - Seçicilik, endekslenmekten daha önemli, indekslenip
dizilmeyeceğine

27

Geçenlerde BrentOzar Unltd http://www.brentozar.com/blitzindex/ adresindeki kişilerden harika bir ücretsiz senaryo keşfettim.

Bu, hangi endekslerin var olduğunu, ne sıklıkta kullanıldığını ve sorgu motorunun mevcut olmayan bir endeksi ne sıklıkla aradığını iyi analiz eder.

Bu rehberlik genellikle iyidir. Bazen fikirleri biraz fazla düşündürür. Genel olarak şu ana kadar aşağıdakileri yaptım:

  • ASLA okunmamış dizinler kaldırıldı (veya ayda 50 kereden az olabilir).
  • Yabancı anahtarlar ve alanlarda kullandığımız en belirgin dizinleri çok kullandığımızdan eminim.

Önerilen tüm dizinleri eklemedim ve sorgu motoru artık diğer yeni dizinlerin bazılarını kullandığından artık kullanılmadıklarını bulmak için bir hafta sonra geri döndüm!

Genellikle şu durumlarda dizinlerden kaçınmalısınız:

  • Çok küçük tablolar (50 - 200 kayıttan az): genellikle endeks yüklemek, okumak, işlemek vb. Yerine tabloyu tararsa, sorgu motoru daha hızlıdır.
  • Belirtilen ilk sütunda Düşük Kardinalitesi olan sütunlarda ( http://en.wikipedia.org/wiki/Cardinality_(SQL_statements) ) dizinlerden kaçının . Örneğin bir cinsiyet alanını (M / F) indekslemek çok az kullanışlıdır, tabloyu taramak ve buna karşılık gelen ~% 50 oranını bulmak kadar pratiktir. Dizinde daha belirgin bir şeyden sonra listeleniyorsa (örneğin, [doğum tarihi, cinsiyet]) daha iyi - tüm Erkeklerin belirli bir zaman diliminde doğmasını isteyebilirsiniz.

Kümelenmiş Dizinler iyidir - normalde bunlar birincil anahtarınıza dayanır. Veritabanı motorunun diskteki verileri düzgün bir şekilde koymasına yardımcı olurlar. İyi bir kümelenmiş indeks olarak çoğu zaman bu tabloları anlamak için çok önemli, tablonun kapladığı alanı azaltır.

Bazı masaları 900 MB’dan 400 MB’ya düşürdüm, çünkü daha önce hiç yığın oluşturmamışlardı. http://msdn.microsoft.com/en-us/library/aa933131(v=sql.80).aspx

Yeniden düzenleyin / Yeniden

Parçalanmış dizinleri kontrol etmek için bakıyor olmalısınız. Biraz parçalanma tamam, takıntılı olma! http://technet.microsoft.com/en-us/library/ms189858.aspx Yeniden düzenleme ve yeniden oluşturma arasındaki farkı öğrenin!

Düzenli Olarak Gözden Geçirin

Sorgular değişir, veri hacimler değişir, yeni özellikler eklenir, eskiler kaldırılır. Onlara ayda bir kez bakıyor olmalı (veya yüksek hacimleriniz varsa daha sık) ve veritabanına yardım edebileceğiniz yeri aramalısınız!

Kaç

Brent son zamanlarda yayınlanan bir videoda (tipik olarak) çok sayıda yazı içeren bir masada 5 indeks önermez (örneğin, sipariş tablosu) ve yazıldığından çok daha fazla okunuyorsa 10'dan fazla olmamasını önerir (örneğin, analiz için tablo kaydı) http: / /www.youtube.com/watch?v=gOsflkQkHjg

Genel olarak, tüm

Değişir!

Kilometreniz veritabanına göre değişir. (Şimdi / Gelecek) büyük masalarınızdaki açık (çalışan soyadı, sipariş tarihi vb.). Gerektiği gibi izleyin, inceleyin ve ayarlayın. Veritabanlarınızı / veritabanlarınızı yönetirken rutin kontrol listenizin bir parçası olmalıdır :)

Bu yardımcı olur umarım!


14

Normalde kişi belirli bir iş yüküne (sorgular) sahip olmak ve her yeni endeksin iş yükü üzerindeki etkisini dikkatlice test etmekle devam eder. Bu yinelemeli süreç her zaman hangi endekslerin kullanıldığını ortaya çıkaracak olan yürütme planlarının dikkatli bir şekilde analizini içermelidir. Bir sorguyu analiz etme konusu uzun bir sorundur ve adanmış MSDN bölümünden başlamak için Sorgu Analizi iyi bir bahistir.

Bazen iş yükü çok karmaşık olduğunda veya veritabanı tasarımının bilgisi kabataslak olduğunda, iş yükünüzün bazı otomatik analizlerini yapan ve bazı endeksleri öneren Veritabanı Motoru Ayarlama Danışmanı kullanılır . Öneriler elbette dikkatlice analiz edilmeli ve etki hemen ölçülmelidir.

Yani fikrimi izlerseniz, bir endeks eklemek ve etkiyi ölçmek gerçekten A / B testinin bir örneğidir : iş yükünüzü endekssiz bir taban çizgisi olarak çalıştırıyorsunuz, daha sonra endeksle çalıştırıyor, ölçüp karşılaştırıyorsunuz Temel çizgi ile birlikte, etkinin faydalı olup olmadığına bakılan ve ölçülen ölçütlere dayanarak karar verin. İş yükü en iyi kalite test paketidir, ancak yakalanan iş yükünün tekrarı da olabilir, bkz. Nasıl Yapılır: Bir İzleme Dosyasını Yeniden Görüntüleme .

Daha sentetik bir cevap, bakış sys.dm_db_index_usage_statsaçısına bakmak ve endekslerin nasıl kullanıldığını görmektir, ancak bu genellikle bilinmeyen bir iş yükü üzerinde yerinde analiz yapmak için bir yaklaşımdır (yani, yardım etmeye çağırılan bir danışman bununla başlayacaktır).


7

SQL 2005 ile başlayarak, SQL Server eğer mevcutlarsa veritabanı motorunun indeksler için ne kullanacağını söyleyen DMV'lere sahiptir . Görünümler size hangi sütunların anahtar sütunlar, hangi sütunların dahil edilmesi gerektiği ve en önemlisi, dizinin kaç kez kullanılacağını söyleyebilir.

İyi bir yaklaşım, eksik dizinler sorgusunu arama sayısına göre sıralamak ve ilk önce en iyi dizinleri eklemeyi düşünmektir.

Ayrıca bakınız: Resmi MS DMV belgeleri


-1

Bu tablonun nasıl kullanıldığına bağlıdır. Örneğin, çokça okunan bir tablo olduğumu söyleyelim ama güncellemeler ve ekler nadirdir. Artı her zaman bazı yabancı anahtar sütununda tabloyu sorgular. Okuma sorgularını hızlandırmak için bu yabancı anahtar üzerinden (kümelenmemiş) dizin oluşturmak mantıklı olacaktır. Ancak olumsuz, ekleme, güncelleme yavaş olacaktır.

Sorguların ne kadar zaman aldığını belirten çok az istatistik sorgusu var. En yavaş olanlarla başlayın. Sorgu yükleminde dizin yoksa, bir tane oluşturmak yardımcı olacaktır.

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.