Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Microsoft Fabric'te SQL veritabanı
Eksik dizinler özelliği, sorgu performansını önemli ölçüde geliştirebilecek eksik dizinleri bulmaya yönelik basit bir araçtır. Bu makalede, dizinleri etkili bir şekilde ayarlamak ve sorgu performansını geliştirmek için eksik dizin önerilerinin nasıl kullanılacağı açıklanmaktadır.
Eksik dizin özelliğinin sınırlamaları
Sorgu iyileştiricisi bir sorgu planı oluşturduğunda, belirli bir filtre koşulu için en iyi dizinlerin ne olduğunu analiz eder. En iyi dizinler yoksa, sorgu iyileştirici hala kullanılabilir en düşük maliyetli erişim yöntemlerini kullanarak bir sorgu planı oluşturur, ancak bu dizinlerle ilgili bilgileri de depolar. Eksik dizinler özelliği, uygulanıp uygulanmayacağına karar verebilmeniz için mümkün olan en iyi dizinler hakkındaki bilgilere erişmenizi sağlar.
Sorgu iyileştirme zamana duyarlı bir işlemdir, bu nedenle eksik dizin özelliğinde sınırlamalar vardır. Sınırlamalar şunlardır:
- Eksik dizin önerileri, sorgu yürütmeden önce tek bir sorgunun iyileştirilmesi sırasında yapılan tahminleri temel alır. Eksik dizin önerileri sorgu yürütüldikten sonra test edilmedi veya güncelleştirilmedi.
- Eksik dizin özelliği yalnızca kümelenmemiş disk tabanlı satır deposu dizinlerini önerir. Benzersiz ve Filtrelenmiş dizinler önerilmez.
- Anahtar sütunlar önerilir, ancak öneri bu sütunlar için bir sıra belirtmez. Sütunları sıralama hakkında bilgi için bu makalenin Eksik dizin önerilerini uygulama bölümüne bakın.
- Dahil edilen sütunlar önerilir, ancak çok sayıda dahil edilen sütun önerildiğinde SQL Server sonuçta elde edilen dizinin boyutuyla ilgili maliyet avantajı analizi gerçekleştirmez.
- Eksik dizin istekleri, sorgular arasında aynı tablo ve sütunlarda benzer dizin varyasyonları sunabilir. Dizin önerilerini gözden geçirmek ve mümkün olduğunca birleştirmek önemlidir.
- Önemsiz sorgu planları için önerilerde bulunulmuyor.
- Maliyet bilgileri yalnızca eşitsizlik koşullarını içeren sorgular için daha az doğrudur.
- En fazla 600 eksik dizin grubu için öneriler toplanır. Bu eşiğe ulaşıldıktan sonra eksik dizin grubu verileri toplanmaz.
Bu sınırlamalar nedeniyle, eksik dizin önerileri en iyi şekilde dizin analizi, tasarım, ayarlama ve test gerçekleştirirken çeşitli bilgi kaynaklarından biri olarak kabul edilir. Eksik dizin önerileri, tam olarak önerilen dizinleri oluşturmaya yönelik reçeteler değildir.
Note
Azure SQL Veritabanı otomatik dizin ayarlama olanağı sunar. Otomatik dizin ayarlama, yapay zeka aracılığıyla Azure SQL Veritabanı'ndaki tüm veritabanlarından yatay olarak bilgi edinmek ve ayarlama eylemlerini dinamik olarak geliştirmek için makine öğrenmesini kullanır. Otomatik dizin ayarlama, oluşturulan dizinlerden iş yükü performansında olumlu bir iyileştirme olduğundan emin olmak için bir doğrulama işlemi içerir.
Eksik dizin önerilerini görüntüleme
Eksik dizinler özelliği iki bileşenden oluşur:
-
MissingIndexesYürütme planlarının XML'sindeki öğesi. Bu, sorgu iyileştiricinin eksik olarak kabul ettiği dizinleri eksik olduğu sorgularla ilişkilendirmenizi sağlar. - Eksik dizinler hakkında bilgi döndürmek için sorgulanabilen dinamik yönetim görünümleri (DMV) kümesi. Bu, bir veritabanı için tüm eksik dizin önerilerini görüntülemenizi sağlar.
Yürütme planlarında eksik dizin önerilerini görüntüleme
Yürütme planına genel bakış birden çok yolla oluşturulabilir veya alınabilir:
- Sorguyu yazarken veya ayarlarken SQL Server Management Studio'yu (SSMS) kullanarak sorguyu çalıştırmadan tahmini yürütme planını görüntüleyebilir veya sorguyu yürütebilir ve gerçek bir yürütme planı görüntüleyebilirsiniz.
- Sorgu Deposu'nı kullanarak performansı izleme, etkinleştirildiğinde yürütme planlarını toplar.
- sys.dm_exec_text_query_plan gibi DMV'leri sorgulayarak önbelleğe alınmış yürütme planlarını tanımlayabilirsiniz.
Örneğin, AdventureWorks örnek veritabanlarında eksik dizin istekleri oluşturmak için aşağıdaki sorguyu kullanabilirsiniz.
SELECT City, StateProvinceID, PostalCode
FROM Person.Address as a
JOIN Person.BusinessEntityAddress as ba on
a.AddressID = ba.AddressID
JOIN Person.Person as p on
ba.BusinessEntityID = p.BusinessEntityID
WHERE p.FirstName like 'K%' and
StateProvinceID = 9;
GO
Eksik dizin isteklerini oluşturmak ve görüntülemek için:
SSMS'yi açın ve AdventureWorks örnek veritabanları kopyanıza bir oturum bağlayın.
Sorguyu oturuma yapıştırın ve SSMS'de sorgu için Tahmini Yürütme Planını Görüntüle araç çubuğu düğmesini seçerek tahmini bir yürütme planı oluşturun. Yürütme planı geçerli oturumdaki bir bölmede görüntülenir. Grafik planının üst kısmında yeşil bir Eksik Dizin deyimi görüntülenir.
Tek bir yürütme planı birden çok eksik dizin isteği içerebilir, ancak grafik yürütme planında yalnızca bir eksik dizin isteği görüntülenebilir. Yürütme planı için eksik dizinlerin tam listesini görüntüleme seçeneği, yürütme planı XML'sini görüntülemektir.
Yürütme planına sağ tıklayın ve menüden Yürütme Planı XML'sini Göster... öğesini seçin.
Yürütme planı XML'i SSMS içinde yeni bir sekme olarak açılır.
Note
Yürütme planı XML'sinde birden çok öneri olsa bile Eksik Dizin Ayrıntıları... menü seçeneğinde yalnızca tek bir eksik dizin önerisi gösterilir. Görüntülenen eksik dizin önerisi, sorgu için en yüksek tahmini iyileştirmeye sahip olan öneri olmayabilir.
CTRL+f kısayolunu kullanarak Bul iletişim kutusunu görüntüleyin.
MissingIndexarayın.Bu örnekte iki
MissingIndexöğe vardır.- İlk eksik dizin, sorgunun
Person.Addresstablosunda eşitlik araması yapanStateProvinceIDsütununda,CityvePostalCodedahil olmak üzere bir dizin kullanabileceğini önerebilir. İyileştirme sırasında, sorgu iyileştiricisi bu dizinin sorgunun tahmini maliyetini 34.2737%düşürebileceğine inanıyordu. - İkinci eksik dizin, sorgunun tabloda FirstName sütununda eşitsizlik aramasını destekleyen bir dizin
Person.Personkullanabileceğini önerir. İyileştirme sırasında, sorgu iyileştiricisi bu dizinin sorgunun tahmini maliyetini 18.1102%düşürebileceğine inanıyordu.
- İlk eksik dizin, sorgunun
Veritabanınızdaki her disk tabanlı kümelenmemiş dizin yer kaplar, eklemeler, güncelleştirmeler ve silmeler için ek yük ekler ve bakım gerektirebilir. Bu nedenlerden dolayı, sorgu yürütme planını temel alan bir dizin eklemeden önce bir tablo için tüm eksik dizin isteklerini ve bir tablodaki mevcut dizinleri gözden geçirmek en iyi yöntemdir.
DMV'lerde eksik dizin önerilerini görüntüleme
Aşağıdaki tabloda listelenen dinamik yönetim nesnelerini sorgulayarak eksik dizinler hakkında bilgi alabilirsiniz.
| Dinamik yönetim görünümü | Döndürülen bilgiler |
|---|---|
| sys.dm_db_missing_index_group_stats | Eksik dizin gruplarıyla ilgili özet bilgileri döndürür; örneğin, belirli bir eksik dizin grubu uygulanarak elde edilebilecek performans iyileştirmeleri. |
| sys.dm_db_missing_index_groups | Grup tanımlayıcısı ve bu grupta yer alan tüm eksik dizinlerin tanımlayıcıları gibi belirli bir eksik dizin grubu hakkındaki bilgileri döndürür. |
| sys.dm_db_missing_index_details | Eksik dizin hakkında ayrıntılı bilgiler döndürür; örneğin, dizinin eksik olduğu tablonun adını ve tanımlayıcısını ve eksik dizini oluşturması gereken sütunları ve sütun türlerini döndürür. |
| sys.dm_db_missing_index_columns | Dizin eksik olan veritabanı tablosu sütunları hakkında bilgi döndürür. |
Aşağıdaki sorgu, deyimleri oluşturmak CREATE INDEX için eksik dizin DMV'lerini kullanır. Buradaki dizin oluşturma deyimleri, tabloya yönelik tüm istekleri ve tablodaki mevcut dizinleri inceledikten sonra kendi DDL'nizi oluşturmanıza yardımcı olmak için tasarlanmıştır.
SELECT TOP 20
CONVERT (varchar(30), getdate(), 126) AS runtime,
CONVERT (decimal (28, 1),
migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans)
) AS estimated_improvement,
'CREATE INDEX missing_index_' +
CONVERT (varchar, mig.index_group_handle) + '_' +
CONVERT (varchar, mid.index_handle) + ' ON ' +
mid.statement + ' (' + ISNULL (mid.equality_columns, '') +
CASE
WHEN mid.equality_columns IS NOT NULL
AND mid.inequality_columns IS NOT NULL THEN ','
ELSE ''
END + ISNULL (mid.inequality_columns, '') + ')' +
ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement
FROM sys.dm_db_missing_index_groups mig
JOIN sys.dm_db_missing_index_group_stats migs ON
migs.group_handle = mig.index_group_handle
JOIN sys.dm_db_missing_index_details mid ON
mig.index_handle = mid.index_handle
ORDER BY estimated_improvement DESC;
GO
Bu sorgu, önerileri adlı estimated_improvementbir sütuna göre sıralar. Tahmini iyileştirme, aşağıdakilerin bir bileşimini temel alır:
- Eksik dizin isteğiyle ilişkili sorguların tahmini sorgu maliyeti.
- Dizini eklemenin tahmini etkisi. Bu, kümelenmemiş dizinin sorgu maliyetini ne kadar azaltacağını gösteren bir tahmindir.
- Eksik dizin isteğiyle ilişkili sorgular için çalıştırılmış olan sorgu işleçlerinin (aramalar ve taramalar) yürütmelerinin toplamı. Sorgu Deposu'nda eksik dizinleri kalıcı hale döndürme konusunda tartıştığımız gibi, bu bilgiler düzenli aralıklarla temizlenir.
Note
Microsoft'un Tiger Toolbox'ındaDizin Oluşturma betiği eksik dizin DMV'lerini inceler ve önerilen gereksiz dizinleri otomatik olarak kaldırır, düşük etkili dizinleri ayrıştırıyor ve gözden geçirmeniz için dizin oluşturma betikleri oluşturuyor. Yukarıdaki sorguda olduğu gibi dizin NOT oluşturma komutlarını yürütür.
Dizin Yaratma betiği SQL Server ve Azure SQL Yönetilen Örnek için optimize edilmiştir. Azure SQL Veritabanı için otomatik dizin ayarlamayı uygulamayı göz önünde bulundurun.
Eksik dizin özelliğinin sınırlamalarını ve dizin oluşturmadan önce eksik dizin önerilerinin nasıl uygulanacağını gözden geçirin ve dizin adını veritabanınızın adlandırma kuralıyla eşleşecek şekilde değiştirin.
Sorgu Deposu ile eksik dizinleri kalıcılaştırın.
DMV'lerdeki eksik dizin önerileri örnek yeniden başlatmaları, yük devretmeler ve veritabanını çevrimdışı ayarlama gibi olaylar tarafından temizlenir. Ayrıca, bir tablonun meta verileri değiştiğinde, bu tabloyla ilgili tüm eksik dizin bilgileri bu dinamik yönetim nesnelerinden silinir. Tablo meta verisi değişiklikleri, sütunlar bir tablodan eklendiğinde veya bırakıldığında veya bir tablonun sütununda dizin oluşturulduğunda oluşabilir. Tablodaki bir dizinde ALTER INDEX işlemi gerçekleştirmek, bu tablo için eksik dizin isteklerini de temizler.
Benzer şekilde, plan önbelleğinde depolanan yürütme planları örnek yeniden başlatmaları, yük devretmeler ve veritabanını çevrimdışı ayarlama gibi olaylar tarafından temizlenir. Bellek baskısı ve yeniden derlemeler nedeniyle yürütme planları önbellekten kaldırılabilir.
Yürütme planlarındaki eksik dizin önerileri , Sorgu Deposu kullanılarak performansı izleme etkinleştirilerek bu olaylar arasında kalıcı hale gelebilir.
Aşağıdaki sorgu, sorgunun toplam mantıksal okumalarının kabaca tahminini temel alarak Sorgu Deposu'ndan eksik dizin isteklerini içeren ilk 20 sorgu planını alır. Veriler son 48 saat içindeki sorgu yürütmeleriyle sınırlıdır.
SELECT TOP 20
qsq.query_id,
SUM(qrs.count_executions) * AVG(qrs.avg_logical_io_reads) as est_logical_reads,
SUM(qrs.count_executions) AS sum_executions,
AVG(qrs.avg_logical_io_reads) AS avg_avg_logical_io_reads,
SUM(qsq.count_compiles) AS sum_compiles,
(SELECT TOP 1 qsqt.query_sql_text FROM sys.query_store_query_text qsqt
WHERE qsqt.query_text_id = MAX(qsq.query_text_id)) AS query_text,
TRY_CONVERT(XML, (SELECT TOP 1 qsp2.query_plan from sys.query_store_plan qsp2
WHERE qsp2.query_id=qsq.query_id
ORDER BY qsp2.plan_id DESC)) AS query_plan
FROM sys.query_store_query qsq
JOIN sys.query_store_plan qsp on qsq.query_id=qsp.query_id
CROSS APPLY (SELECT TRY_CONVERT(XML, qsp.query_plan) AS query_plan_xml) AS qpx
JOIN sys.query_store_runtime_stats qrs on
qsp.plan_id = qrs.plan_id
JOIN sys.query_store_runtime_stats_interval qsrsi on
qrs.runtime_stats_interval_id=qsrsi.runtime_stats_interval_id
WHERE
qsp.query_plan like N'%<MissingIndexes>%'
and qsrsi.start_time >= DATEADD(HH, -48, SYSDATETIME())
GROUP BY qsq.query_id, qsq.query_hash
ORDER BY est_logical_reads DESC;
GO
Eksik dizin önerilerini uygulama
Eksik dizin önerilerini etkili bir şekilde kullanmak için , kümelenmemiş dizin tasarım yönergelerini izleyin. Dizin önerileri eksik olan kümelenmemiş dizinleri ayarlarken temel tablo yapısını gözden geçirin, dizinleri dikkatlice birleştirin, anahtar sütun sırasını göz önünde bulundurun ve dahil edilen sütun önerilerini gözden geçirin.
Temel tablo yapısını gözden geçirme
Eksik dizin önerilerini temel alan bir tabloda kümelenmemiş dizinler oluşturmadan önce tablonun kümelenmiş dizinini gözden geçirin.
Kümelenmiş dizini denetlemenin bir yolu, sp_helpindex sistem saklı yordamını kullanmaktır. Örneğin, aşağıdaki deyimi yürüterek tablodaki Person.Address dizinlerin özetini görüntüleyebiliriz:
exec sp_helpindex 'Person.Address';
GO
index_description sütununu gözden geçirin. Bir tabloda yalnızca bir kümelenmiş dizin olabilir. Tablo için kümelenmiş dizin uygulandıysa , index_description 'kümelenmiş' sözcüğünü içerir.
Kümelenmiş dizin yoksa, tablo bir yığındır. Bu durumda, tablonun belirli bir performans sorununu çözmek için kasıtlı olarak yığın olarak oluşturulup oluşturulmadığını gözden geçirin. Çoğu tablo kümelenmiş dizinlerden yararlanmaktadır: genellikle tablolar yanlışlıkla yığın olarak uygulanır. Kümelenmiş dizin tasarım yönergelerine göre kümelenmiş dizin uygulamayı göz önünde bulundurun.
Çakışma için eksik dizinleri ve mevcut dizinleri gözden geçirin
Eksik dizinler, sorgular arasında aynı tablo ve sütunlarda kümelenmemiş dizinlerin benzer varyasyonlarını sunabilir. Eksik dizinler, tablodaki mevcut dizinlere de benzer olabilir. En iyi performans için eksik dizinleri ve var olan dizinleri örtüşme açısından incelemek ve yinelenen dizinler oluşturmaktan kaçınmak en iyisidir.
Tablodaki mevcut dizinler için bir betik oluşturma
Bir tablodaki mevcut dizinlerin tanımını incelemenin bir yolu, Nesne Gezgini Ayrıntıları ile dizinleri listelemektir.
- Nesne Gezgini'ne örnek veya veritabanınıza bağlanın.
- Nesne Gezgini'nde söz konusu veritabanının düğümünü genişletin.
- Tablolar klasörünü genişletin.
- İndeks betiği oluşturmak istediğiniz tabloyu genişletin.
- Dizinler klasörünü seçin.
- Nesne Gezgini Ayrıntıları bölmesi henüz açık değilse , Görünüm menüsünde Nesne Gezgini Ayrıntıları'nı seçin veya F7 tuşuna basın.
- CTRL+a kısayoluyla Nesne Gezgini Ayrıntıları bölmesinde listelenen tüm dizinleri seçin.
- Seçili bölgede herhangi bir yere sağ tıklayın ve Betik dizini olarak menü seçeneğini, ardından
CREATETo** ve Yeni Sorgu Düzenleyicisi Penceresi'ni seçin.
Dizinleri gözden geçirin ve mümkün olduğunca birleştirin
Tablodaki mevcut dizinlerin tanımlarıyla birlikte, grup olarak tablo için eksik dizin önerilerini gözden geçirin. Dizinleri tanımlarken, genellikle eşitlik sütunlarının eşitsizlik sütunlarından önce koyulması ve birlikte dizinin anahtarını oluşturması gerektiğini unutmayın. Eşitlik sütunlarının etkili bir sırasını belirlemek için, bunları seçiciliklerine göre sırala: önce en seçmeli sütunları listeleyin (sütun listesinde en soldaki). Benzersiz sütunlar en seçicidir, çok sayıda yinelenen değere sahip sütunlar ise daha az seçicidir.
Yan tümcesi kullanılarak CREATE INDEX deyimine INCLUDE eklenen sütunlar eklenmelidir. Eklenen sütunların sırası sorgu performansını etkilemez. Bu nedenle, dizinler birleştirildiğinde, dahil edilen sütunlar sıra konusunda endişelenmeden birleştirilebilir.
Eklenen sütunlar yönergelerinde daha fazla bilgi edinin.
Örneğin, anahtar sütunu Person.Address üzerinde mevcut olan dizini bulunan bir StateProvinceID tablonuz olabilir. Aşağıdaki sütunlar için Person.Address tablosu için eksik dizin önerilerini görebilirsiniz.
-
StateProvinceIDveCityiçin EŞİTLİK filtreleri - ve
StateProvinceIDiçinCityEŞITLİk filtreleriINCLUDEPostalCode
Mevcut dizini, her iki dizin önerisini de oluşturan sorguları büyük olasılıkla karşılayacak şekilde, anahtarları StateProvinceID ve City olan, PostalCode içeren bir dizine dönüştürmek için ikinci öneriyle uyumlu hale getirmek.
Tavizler, dizin ayarlamada yaygındır. Birçok veri kümesi için sütunun City sütundan StateProvinceID daha seçici olması olasıdır. Bununla birlikte, üzerinde StateProvinceID mevcut dizinimiz yoğun olarak kullanılıyorsa ve diğer istekler hem de StateProvinceIDCityüzerinde büyük ölçüde arama yapıyorsa, genel olarak veritabanı için her iki sütunun da anahtarında StateProvinceIDtek bir dizine sahip olması daha düşük bir yük oluşturur ve en seçici sütun değildir.
Dizinler birden çok şekilde değiştirilebilir:
- CREATE INDEX Deyimini DROP_EXISTING yan tümcesiyle kullanabilirsiniz. Adlandırma kuralınıza bağlı olarak adın dizin tanımını doğru şekilde tanımlaması için değişiklik sonrasında dizinleri yeniden adlandırmak isteyebilirsiniz.
- DROP INDEX (Transact-SQL) deyimini ve ardından CREATE INDEX Deyimini kullanabilirsiniz.
Dizin anahtarlarının sırası, dizin önerilerini birleştirirken önemlidir: City birincil sütun olduğunda, StateProvinceID'den farklıdır.
Kümelenmemiş dizin tasarımı yönergelerinde daha fazla bilgi edinin.
Dizin oluştururken, kullanılabilir olduğunda çevrimiçi dizin işlemlerini kullanmayı göz önünde bulundurun.
Dizinler bazı durumlarda sorgu performansını önemli ölçüde geliştiremese de dizinlerin ek yükü ve yönetim maliyetleri de vardır. Dizinleri oluşturmadan önce avantajlarını değerlendirmeye yardımcı olmak için genel dizin tasarımı yönergelerini gözden geçirin.
Dizin değişikliğinizin başarılı olup olmadığını doğrulayın
Dizin değişikliklerinizin başarılı olup olmadığını onaylamak önemlidir: Sorgu iyileştirici dizinlerinizi kullanıyor mu?
Dizin değişikliklerinizi doğrulamanın bir yolu, eksik dizin isteklerine sahip sorguları tanımlamak için Sorgu Deposu'yu kullanmaktır. Sorgular için query_id not edin. Bir sorgu için yürütme planlarının değişip değişmediğini ve iyileştiricinin yeni veya değiştirilmiş dizininizi kullanıp kullanmadiğini denetlemek için Sorgu Deposu'ndaki İzlenen Sorgular görünümünü kullanın. Sorgu performansı sorunlarını giderme ile başlarken İzlenen Sorgular hakkında daha fazla bilgi edinin.
İlgili içerik
- SQL Server ve Azure SQL dizin mimarisini ve tasarım kılavuzunu
- sys.dm_db_missing_index_details (Transact-SQL)
- Sorgu Deposu’nu kullanarak performansı izleme