Próbuję dowiedzieć się więcej na temat operatora planu zapytań „sprawdzanie referencji klucza obcego” wprowadzonego w SQL Server 2016. Nie ma na ten temat zbyt wielu informacji. Microsoft ogłosił to tutaj, a ja blogowałem o tym tutaj . Nowego operatora można zobaczyć, usuwając wiersz z tabeli nadrzędnej z 254 lub więcej przychodzącymi odwołaniami do kluczy obcych: dbfiddle link .
Istnieją trzy różne liczby wyświetlane w szczegółach operatora:
- Liczba odwołań do kluczy obcych to liczba przychodzących kluczy obcych.
- Brak pasującej liczby indeksów to liczba przychodzących kluczy obcych bez odpowiedniego indeksu. Sprawdzenie, czy zaktualizowana lub usunięta tabela nie naruszy tego ograniczenia, będzie wymagać skanowania tabeli podrzędnej.
- Nie wiem, co reprezentuje indeks częściowego dopasowania .
Co to jest indeks częściowego dopasowania w tym kontekście? Nie byłem w stanie uzyskać żadnego z poniższych:
- Filtrowane indeksy
- Umieszczenie kolumny klucza obcego jako
INCLUDE
kolumny dla indeksu - Indeksuje z kolumną klucza obcego jako drugą kolumną klucza
- Indeksy jednokolumnowe dla kluczy obcych o wielu kolumnach
- Tworzenie wielu indeksów obejmujących, aby umożliwić plan „przyłączenia indeksu” dla klucza obcego z wieloma kolumnami
Dan Guzman wskazał, że klucze obce wielu kolumn mogą pasować do indeksów, nawet jeśli klucze indeksu są w innej kolejności niż kolumny kluczy obcych. Jego kod jest tutaj, na wypadek, gdyby ktoś mógł go użyć jako punktu wyjścia, aby dowiedzieć się więcej na temat indeksów częściowego dopasowania.
źródło
Po kilku kolejnych poszukiwaniach w Google udało mi się wymyślić post, w którym wspomniano o „indeksach częściowego dopasowania” i kluczach obcych
W blogu z 1 marca 2013 r. W blogu Code Carlosa Klappa zatytułowanym
Foreign Keys without Indexes
znajduje się procedura przechowywana,Util_FKsWithoutIndexes
która wyszukuje klucze obce, które nie mają odpowiednich indeksów dla relacji FK. (Wygląda na to, że ten blogger podniósł to z SQL Server CentralThe Ultimate Index-Less Foreign-Key Finder
(15 października 2009) ). Blog mówi:Jeśli dobrze to rozumiem, jeśli relacja FK nie ma indeksu pasującego do każdej kolumny w jakimś potrzebnym indeksie, mogą istnieć pewne indeksy, które mają niektóre kolumny. Na przykład, jeśli związek FK ma trzy kolumny (
a
,b
,c
) ale nie ma indeksu z tych samych trzech kolumnach, może istnieć indeks, który ma (a
,b
) lub (a
,c
) lub (b
,c
) i może pomóc z zapytaniami, ale będzie wymagają niektórych skanowań indeksu do wierszy z brakującą kolumną.Jeśli w ogóle nie ma indeksów, które mogłyby obsługiwać ograniczenie FK, wówczas „Licznik indeksów częściowego dopasowania” wyniesie zero (
0
) lub przynajmniej nie zwiększy tej liczby.źródło
(FKey2,FKey3)
i utwórz indeks naFKey2
. Spróbuj tego.create unique index FULL_IX_UNIQUE ON FK_PARENT_TABLE (FKey, Fkey2, Fkey3)
, utrzymać indeks włączonyFKey2
i spróbować ponownie.