Jak uzyskać listę wszystkich indeksów i kolumn indeksów w SQL Server 2005+? Najbliższe, jakie mogłem uzyskać, to:
select s.name, t.name, i.name, c.name from sys.tables t
inner join sys.schemas s on t.schema_id = s.schema_id
inner join sys.indexes i on i.object_id = t.object_id
inner join sys.index_columns ic on ic.object_id = t.object_id
inner join sys.columns c on c.object_id = t.object_id and
ic.column_id = c.column_id
where i.index_id > 0
and i.type in (1, 2) -- clustered & nonclustered only
and i.is_primary_key = 0 -- do not include PK indexes
and i.is_unique_constraint = 0 -- do not include UQ
and i.is_disabled = 0
and i.is_hypothetical = 0
and ic.key_ordinal > 0
order by ic.key_ordinal
Co nie jest dokładnie tym, czego chcę.
Chcę, aby wyświetlić listę wszystkich indeksów zdefiniowanych przez użytkownika ( co oznacza brak indeksów, które obsługują unikalne ograniczenia i klucze podstawowe ) ze wszystkimi kolumnami (uporządkowanymi według ich wyglądu w definicji indeksu) oraz jak najwięcej metadanych, jak to możliwe.
sql-server
tsql
indexing
reverse-engineering
Anton Gogolev
źródło
źródło
Odpowiedzi:
Dostępne są dwa widoki katalogu „sys”:
Dadzą ci one prawie wszystkie informacje na temat indeksów i ich kolumn.
EDYCJA: To zapytanie zbliża się do tego, czego szukasz:
źródło
is_ms_shipped=0
), ale nie klucze podstawowe (is_primary_key=0
) i żadne indeksy, które są tworzone tylko w celu obsługi unikalnych ograniczeń (is_unique_constraint=0
).WHERE (1=1)
pozwól mu łańcuch i uporządkować swojeAND ...
bez martwienia się o to, co było pierwsze. Zobacz: stackoverflow.com/a/8149183/1160796 i stackoverflow.com/a/242831/1160796Możesz użyć
sp_helpindex
do wyświetlenia wszystkich indeksów jednej tabeli.I dla wszystkich indeksów można przejść,
sys.objects
aby uzyskać wszystkie indeksy dla każdej tabeli.źródło
Żadne z powyższych nie wykonało dla mnie pracy, ale robi to:
Jeśli twoje imiona zawierają spacje, dodaj nawiasy kwadratowe wokół nich w skryptach tworzenia.
Kiedy ostatnia kolumna Klucz ma wartość zerową, wiesz, że żadnej nie brakuje.
Filtrowanie kluczy podstawowych itp., Tak jak w pierwotnym żądaniu, jest banalne.
UWAGA: Uważaj na to rozwiązanie, ponieważ nie rozróżnia on indeksowanych i dołączonych kolumn.
źródło
--Krótkie i słodkie:
źródło
Poniższe działa na SQL Server 2014/2016, a także na dowolnej bazie danych Microsoft Azure SQL.
Tworzy kompleksowy zestaw wyników, który można łatwo eksportować do Notatnika / Excela w celu krojenia i krojenia w kostki i obejmuje
źródło
Cześć chłopaki, nie przeszedłem, ale dostałem to, czego chciałem w zapytaniu opublikowanym przez oryginalnego autora.
Użyłem go (bez warunków / filtrów) dla moich wymagań, ale dało to nieprawidłowe wyniki
Głównym problemem były wyniki uzyskiwania krzyżowego produktu bez warunku przyłączenia dla index_id
źródło
Potrzebowałem też konkretnych indeksów, ich kolumn indeksów i dołączonych do nich kolumn. Oto zapytanie, którego użyłem:
źródło
SELECT
, aby wygenerowaćCREATE
oświadczenia:,CreateStatement = 'CREATE INDEX [' + INX.[name] + '] ON dbo.[' + TBL.[name] + '] (' + REPLACE(DS1.IndexColumnsNames, '] [', '], [') + ')' + CASE WHEN DS2.IncludedColumnsNames IS NOT NULL THEN ' INCLUDE (' + REPLACE(DS2.IncludedColumnsNames, '] [', '], [') + ')' ELSE '' END
.Poniżej podaje coś, co jest podobne do sp_helpindex tablename
źródło
Na podstawie zaakceptowanej odpowiedzi i dwóch innych pytań 1 , 2 opracowałem następujące zapytanie:
To zapytanie zwraca wyniki takie jak poniżej, które pokazują listę indeksów, ich kolumny i użycie. Bardzo pomocny w określeniu, który indeks działa lepiej niż inne:
źródło
to zadziała:
nie zwraca to nazwy tabeli i otrzymasz ostrzeżenia dla wszystkich tabel bez indeksu, jeśli to jest problem, możesz utworzyć pętlę nad tabelami, które mają takie indeksy:
EDYTUJ,
jeśli chcesz, możesz filtrować dane, oto kilka przykładów (działają one dla każdej metody):
źródło
źródło
index_column_id
jest kolejnością kolumn w PK, ale w tabeli! Użyj zamiast tego.key_ordinal
Jest to sposób na powrót do indeksów. Możesz użyć SHOWCONTIG do oceny fragmentacji. Wyświetla listę wszystkich indeksów bazy danych lub tabeli wraz ze statystykami. Ostrzegam, że w dużej bazie danych może to być długotrwałe. Dla mnie jedną z zalet tego podejścia jest to, że nie musisz być administratorem, aby z niego korzystać.
- Pokaż informacje o fragmentacji wszystkich indeksów w bazie danych
... po zakończeniu wyłącz NOCOUNT
- Pokaż informacje o fragmentacji wszystkich indeksów w tabeli
- Pokaż informacje o fragmentacji określonego indeksu
źródło
Czy mogę zaryzykować inną odpowiedź na to nasycone pytanie?
Jest to liberalna przeróbka odpowiedzi @marc_s, zmieszanej z niektórymi rzeczami @Tim Ford, w celu uzyskania nieco czystszego i prostszego zestawu wyników oraz ostatecznego wyświetlania i zamawiania dla mojej bieżącej potrzeby.
źródło
w oparciu o kod Tima Forda, to poprawna odpowiedź:
źródło
index_column_id
jest kolejnością kolumn w PK, ale w tabeli! Użyj zamiast tego.key_ordinal
Wymyśliłem ten, który daje mi dokładny przegląd, którego potrzebuję. Pomocne jest to, że dostajesz jeden wiersz na indeks, do którego agregowane są kolumny indeksu.
źródło
Ponieważ twoje stany profilu, którego używasz .NET Państwo mogli korzystać z serwera Managed Objects (SMO) potrzeb programowego ... inaczej któregokolwiek z powyższych odpowiedzi są fantastyczne.
źródło
Powyższe rozwiązanie jest eleganckie, ale według MS INDEXKEY_PROPERTY jest przestarzałe. Zobacz: http://msdn.microsoft.com/en-us/library/ms186773.aspx
źródło
W Oracle
W SQL Server z
źródło
Pamiętaj, że jeśli zamierzasz użyć któregokolwiek z powyższych działających zapytań do skryptu indeksów, musisz włączyć kolumnę filter_definition z tabeli sys.indexes w swoich zapytaniach, aby uzyskać definicję filtra indeksów nieklastrowanych w SQL 2008+
JESTEM
źródło
Poniższe zapytanie zawiera wszystkie istotne informacje dla indeksów zdefiniowanych przez użytkownika (brak indeksów dla unikalnych ograniczeń i kluczy podstawowych) ze wszystkimi kolumnami:
Jako dodatkowy bonus, poniższe zapytanie jest sformatowane, aby wypisać skrypty tworzenia indeksu i upuszczania indeksów:
źródło
Jest mój, działa na jednym domyślnym schemacie, ale można go łatwo poprawić. Daje 3 kolumny z SQLQueries - Utwórz / Usuń / Przebuduj (bez reorganizacji)
Pytanie:
Wynik
źródło
Po pierwsze, pamiętaj, że wszystkie powyższe zapytania mogą pomijać lub błędnie zawierać kolumny ZAWIERAJĄ indeksy. W niektórych brakuje również właściwej kolejności i / lub opcji ASC / DESC kolumn.
Zmodyfikowałem powyższe zapytanie przez jona. Nawiasem mówiąc, w wielu bazach danych, z których korzystam, instaluję własną funkcję agregującą CLR CONCATENATE, więc poniższy kod zależy od czegoś takiego. Powyższe instrukcje SQL redukują się do znacznie łatwiejszego w utrzymaniu:
Istnieje wiele agregatów konkatenacji , jeśli twoje środowisko pozwala na dodanie funkcji opartych na CLR.
źródło
W przypadku unikalnych kolumn według indeksu:
źródło
Oto najlepszy sposób, aby to zrobić:
Wolę używać połączeń niejawnych, ponieważ łatwiej mi to zrozumieć. Możesz usunąć odwołanie object_id, ponieważ może nie być potrzebne.
Twoje zdrowie.
źródło
Za pomocą programu SQL Server 2016 daje to pełną listę wszystkich indeksów wraz z dołączonym zrzutem każdej tabeli, dzięki czemu można zobaczyć, jak te tabele się odnoszą. Pokazuje także kolumny zawarte w indeksach obejmujących:
źródło
index_column_id
jest kolejnością kolumn w PK, ale w tabeli! Użyj zamiast tego.key_ordinal
Kiedy miałem ten wymóg, użyłem następującego zapytania ...
źródło
Działające rozwiązanie dla SQL Server 2014. Podałem tu tylko garść pól wyjściowych, ale możesz dodać tyle, ile chcesz.
źródło
index_column_id
jest kolejnością kolumn w PK, ale w tabeli! Użyj zamiast tego.key_ordinal
Zaktualizowałem odpowiedź KFD9.
Dostosowałem ich wersję do obsługi specyfikacji dołączania i nie korzystałem z indeksu_klucza, który jest przestarzały
Daje to instrukcję tworzenia i upuszczania indeksów i ograniczeń.
źródło
źródło
index_column_id
jest kolejnością kolumn w PK, ale w tabeli! Użyj zamiast tego.key_ordinal