SELECT *
FROM sys.foreign_keys fk
WHERE EXISTS
(
SELECT *
FROM sys.foreign_key_columns fkc
WHERE fkc.constraint_object_id = fk.object_id
AND NOT EXISTS
(
SELECT *
FROM sys.index_columns ic
WHERE ic.object_id = fkc.parent_object_id
AND ic.column_id = fkc.parent_column_id
AND ic.index_column_id = fkc.constraint_column_id
)
)
nie mam kopię SQL Server 2000
poręczne, ale być może trzeba zmienić sys.foreign_key
do sysforeignkeys
itp, jak opisano here
.
To zapytanie wybiera wszystkie klucze obce, które nie mają indeksu obejmującego wszystkie kolumny, które składają się na klucz.
Obsługuje również wielokolumnowe klucze obce.
To jednak zwróci fałszywy wynik pozytywny, jeśli istnieje złożony indeks obejmujący wszystkie kolumny, ale nie są one skrajnie lewymi kolumnami w tym indeksie.
Podobnie, jeśli istnieje i indeks na (col1, col2, col3)
, zwróci to, że istnieje indeks pomimo faktu, że ten indeks nie nadaje się do użycia dla tego klucza obcego.
Brakujące lub rzadko używane? Ten artykuł dotyczy roku 2005, ale może pomóc: http://blogs.msdn.com/sqlcat/archive/2006/02/13/531339.aspx –
Brakujący. Rzadko używana jest kolejna interesująca optymalizacja wydajności, ale nie to, co mnie tutaj interesuje. –