Potansiyel endeksleri nasıl birleştirilir

oy
0

Bazı kayıp endeksi kodu (aşağıya bakınız) Ben internet aramalarından var belirli bir tablo için potansiyel kayıp endeksler bir sürü listeleme edilir. Tam anlamıyla ben 30 dizinleri gerektiğini söylüyor. Zaten kodu çalıştırmadan önce 8 vardı. Çoğu uzman ihtiyaçlarını indeksleme tabloların çoğu kapsayacak şekilde bir tablo Bunları eksik endekslerinin çoğunluğunu birleştirmek Can 5. ortalama gerektiğini belirtmektedirler?

Örneğin: Bu iki endeksler bunlar birleştirilebilir gibi görünüyor yeterince benzerdir. Ama onlar?

CREATE INDEX [NCI_12345] ON [DB].[dbo].[someTable] ([PatSample], [StatusID], [Sub1Sample]) INCLUDE ([PatID], [ProgID], [CQINumber])


CREATE INDEX [NCI_2535_2534] ON [DB].[dbo].[someTable] ([PatSample], [SecRestOnly]) INCLUDE ([CQINumber])

Onları birleştirirseniz bu benzeyecektin:

CREATE INDEX [NCI_12345] ON [DB].[dbo].[someTable] ([PatSample], [StatusID], [Sub1Sample], [SecRestOnly]) INCLUDE ([PatID], [ProgID], [CQINumber])

NOT: Sadece ilk ifadesini aldı ve ekledi [SecRestOnly]kendisine.

SORU: Bu ikisi endeks ihtiyaçlarını karşılamak birleştirerek misiniz? değil ise, nasıl alanları dolu bir derece kullanılan tablo hiç sadece 5 endeksler olurdu?

İşte kayıp endeksleri almak için kullanılan kod:

SELECT
   migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure, LEFT (PARSENAME(mid.STATEMENT, 1), 32) as TableName,
  'CREATE INDEX [NCI_' + CONVERT (VARCHAR, mig.index_group_handle) + '_' + CONVERT (VARCHAR, mid.index_handle)
  + '_' + LEFT (PARSENAME(mid.STATEMENT, 1), 32) + ']'
  + ' 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,
  migs.*, mid.database_id, mid.[object_id]
FROM [sys].dm_db_missing_index_groups mig
INNER JOIN [sys].dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN [sys].dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC;```
Oluştur 10/10/2019 saat 00:49
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
1

Verdiğin örnek size istenilen sonucu vermeyecektir. dizin ([PatSample], [SecRestOnly]), örneğin "PatSample = VAL1 ve SecRestOnly = val2" olarak arama durumunu optimize eder. Kombine endeks arama durumda iki sütun arasındaki diğer kesimleri vardır çünkü. hatırlar anahtarı arama sütun indeksi ilk üst üste segmentleri olduğunda çok parçalı indeks, birden çok "eşitlik" arama optimize etmek için kullanılabilir olmasıdır.

Eğer (col1, col2, col3) üzerine bir (col1, col2) fihristesini başka olduğunu varsayalım o gerekçeli edilebilir, göz önüne alındığında, daha sonra eski gerekli değildir.

Kaç endeks olması güncelleme performansı ve arama performansı arasında bir ters orantı olduğunu. Daha endeksi / ekleme / güncelleme yavaşlatmak silmek ancak sorgu iyileştirici aramaları optimize etmek için daha fazla seçenek verecektir olacaktır. senin örneğin göz önüne alındığında, başvurunuzun eğer böyleyse, o kendi başına veya bir çok kademeli endeksinin ilk parçası "secRestOnly" indeksi olması daha iyi olurdu, sık sık tek başına "SecRestOnly" arama gerektirir. arama nadiren sütun üzerinde yapılırsa, o zaman böyle bir dizin yok etmek mantıklı olabilir.

Cevap 10/10/2019 saat 03:23
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more