“Kısmi Eşleşme Endeksi” nedir?


27

SQL Server 2016'da tanıtılan "yabancı anahtar başvuruları kontrolü" sorgu planı operatörü hakkında daha fazla bilgi edinmeye çalışıyorum. Bu konuda çok fazla bilgi yok. Microsoft, bunu açıkladı burada ve bu konuda blogged burada . Yeni operatör, 254 veya daha fazla gelen yabancı anahtar referansları olan bir ana tablodan bir satır silinerek görülebilir: dbfiddle link .

Operatör ayrıntılarında görüntülenen üç farklı sayı vardır:

FK ayrıntıları kontrol et

  • Yabancı Anahtar Referans Sayısı , gelen yabancı anahtarların sayısıdır.
  • Eşleşen Dizin Yok Sayısı , uygun bir dizin içermeyen gelen yabancı anahtarların sayısıdır. Güncellenmiş veya silinmiş tablonun bu kısıtlamayı ihlal etmeyeceğini doğrulamak alt tablo taramasını gerektirecektir.
  • Kısmi Eşleşen Endeks Sayısının neyi temsil ettiğini bilmiyorum .

Bu bağlamda kısmi bir eşleşme indeksi nedir? Çalışmak için aşağıdakilerden hiçbirini alamadım:

  • Filtrelenmiş dizinler
  • Yabancı anahtar sütununu INCLUDEbir dizin için sütun olarak koymak
  • İkinci anahtar sütun olarak yabancı anahtar sütunu olan dizinler
  • Birden çok sütun yabancı anahtarı için tek sütun dizinleri
  • Birden fazla sütun için yabancı anahtar için "dizin birleştirme" planını etkinleştirmek üzere birden çok kaplama dizini oluşturma

Dan Guzman , indeks anahtarları yabancı anahtar sütunlardan farklı bir düzende olsa bile, çoklu sütun yabancı anahtarlarının indekslerle eşleşebileceğini belirtti. Kısmi eşleştirme indeksleri hakkında daha fazla bilgi edinmek için birinin başlangıç ​​noktası olarak kullanabilmesi durumunda kodu burada .

Yanıtlar:


13

Benden daha zeki insanlarla konuştum ve yakında bunu belgeleyeceğiz ™.

Bunun asıl tanımı, aradaki:

PartialMatchingIndexCount, dizin aramaları kullanılarak kontrol edilebilecek referans sayısını gösterir, ancak dizin anahtarı kontrol edilen tüm sütunları kapsamaz. Örneğin, karşılık gelen ForeignKeyReferenceCheck öğeleri, hem Seek Predicates hem de Predicate öğesi içerir.

Ek olarak:

Bu sayı 0'dan büyükse, kısmi eşleşmelerin çok sayıda satırla sonuçlanması durumunda olası bir performans sorunu vardır.


6
Çalışan bir örnek veya gerçek belgeler muhteşem olurdu. Ödül teklif edildi
Tom V - Team Monica

3

Biraz daha googling yaptıktan sonra, "Kısmi Eşleşen Endeksler" ve Yabancı Anahtarlardan bahseden bir yazı bulmayı başardım.

1 Mart başlıklı Carlos KLAPP en Kod Blog 2013 Blog PostForeign Keys without Indexes Saklı Yordam denilen sahiptir Util_FKsWithoutIndexesFK ilişkileri için uygun indeks bulunmaz yabancı anahtarlar için hangi görünüyor. (Görünüşe göre bu blogcu bunu SQL Server Central'danThe Ultimate Index-Less Foreign-Key Finder kaldırdı (15 Eki 2009) ) Blog şöyle diyor:

Tam olarak eşleşen dizinleri olmayan yabancı anahtar kısıtlamaları arar.

En iyi kısmi eşleşme indeksleri MatchCounts ve sütun karşılaştırmaları ile çıkarılır

Eşleşen indeks veya kısmi eşleştirme indeksi olmayan her yabancı anahtar için bir CREATE INDEX şablonu oluşturur.

Gerektiği şekilde özelleştirin (eklemek, kümelenmesini istiyorsanız veya birincil anahtarın bir parçası olması gerekiyorsa veya başka bir dizinle birleştirmek istiyorsanız ekleyin)

Tam eşleşme indeksleri eksik olan FK'ler, referans bütünlüğünü kontrol etmek için yapılan tablo taramaları ve yabancı anahtar sütunun (ler) in WHERE veya JOIN tahminlerinde olduğu referans tablolarındaki SELECTS nedeniyle referans tablodaki DELETES'in performansını ciddi şekilde zedeleyebilir. (Bu bir kısıtlamanın mevcut olup olmadığını etkileyecektir). Bu, N dizinin ilk N sütununu kontrol eder; burada N, yabancı anahtar kısıtındaki sütun sayısıdır.

Dizin sütunu sırası bunun ötesinde doğrulanmadı (3 sütunlu bir dizinin 2. sütununda 1 eşleştirme sütununa sahip iki sütunlu bir FK, kısmi eşleşme olarak çıkacak)

Veritabanınızın yabancı anahtar kısıtlamaları yoksa, bu araç sizin için değersiz olacaktır.

Birçok veritabanında kısmi yabancı anahtar kısıtlama kapsamı vardır. Bu sadece kısıtlamaların ilan edildiği ilgili tablolarda çalışır.

Bunu doğru anlarsam, bir FK ilişkisi gerekli bazı indekslerdeki her sütuna uyan bir dizine sahip değilse, bazı sütunlara sahip bazı indeksler olabilir. Örneğin, bir FK ilişki üç sütun varsa ( a, b, c) ama bu aynı üç sütunlu yok bir dizin, orada bir (sahiptir endeksi var olabilir a, b) veya ( a, c) veya ( b, c) ile sorgu ile yardımcı olabilir ama olacak bazı dizin taramaları eksik sütunlu satırlara gerek duyar.

Eğer bir FK sınırlamasını destekleyebilecek bir indeks yoksa, "Kısmi Eşleşen İndeks Sayısı" sıfır olacaktır ( 0) veya en azından bu sayıyı arttırmayacaktır.


Aklında olan bu muydu? Yine işe yaramazsa ... dbfiddle.uk/…
Joe Obbish

Tam olarak değil. Bir FK (FKey2,FKey3)oluşturmayı deneyin ve üzerinde bir dizin oluşturun FKey2. Lütfen dene.
RolandoMySQLDBA

Lütfen bir SQL Server adamı olmadığımı ama yardım etmeye çalıştığımı unutmayın.
RolandoMySQLDBA

Denemek için herhangi bir fikri anlıyor ve takdir ediyorum. Ayrıca iki sütunun çalışmasını sağlayamıyorum.
Joe Obbish,

Çukuru açabilir create unique index FULL_IX_UNIQUE ON FK_PARENT_TABLE (FKey, Fkey2, Fkey3), dizini açık tutabilir FKey2ve tekrar deneyebilirsiniz.
RolandoMySQLDBA
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.