Czy Postgres automatycznie umieszcza indeksy na kluczach obcych i kluczach podstawowych? Jak mogę powiedzieć? Czy istnieje polecenie, które zwróci wszystkie indeksy w tabeli?
źródło
Czy Postgres automatycznie umieszcza indeksy na kluczach obcych i kluczach podstawowych? Jak mogę powiedzieć? Czy istnieje polecenie, które zwróci wszystkie indeksy w tabeli?
PostgreSQL automatycznie tworzy indeksy na kluczach podstawowych i unikalnych ograniczeniach, ale nie na stronie odniesienia relacji klucza obcego.
Kiedy Pg tworzy domyślny indeks, wyemituje NOTICE
komunikat poziomu, który można zobaczyć w psql
logach systemowych i / lub w dziennikach systemowych, aby można było zobaczyć, kiedy to nastąpi. Automatycznie tworzone indeksy są również widoczne w \d
danych wyjściowych dla tabeli.
Dokumentacja unikalnych indeksów mówi:
PostgreSQL automatycznie tworzy indeks dla każdego ograniczenia unikalnego i kluczowego, aby wymusić unikalność. Dlatego nie jest konieczne jawne tworzenie indeksu dla kolumn klucza podstawowego.
a dokumentacja ograniczeń mówi:
Ponieważ USUWANIE wiersza z tabeli, do której następuje odwołanie, lub AKTUALIZACJA kolumny, do której następuje odwołanie, będzie wymagało skanowania tabeli odniesienia w celu znalezienia wierszy pasujących do starej wartości, często dobrym pomysłem jest zaindeksowanie kolumn odniesienia. Ponieważ nie zawsze jest to potrzebne i istnieje wiele możliwości wyboru sposobu indeksowania, deklaracja ograniczenia klucza obcego nie tworzy automatycznie indeksu w kolumnach odniesienia.
Dlatego jeśli chcesz, musisz samodzielnie tworzyć indeksy kluczy obcych.
Zauważ, że jeśli użyjesz podstawowych kluczy obcych, takich jak 2 FK jako PK w tabeli od M do N, będziesz mieć indeks na PK i prawdopodobnie nie będziesz musiał tworzyć żadnych dodatkowych indeksów.
Chociaż zwykle dobrym pomysłem jest utworzenie indeksu w kolumnach kluczy obcych po stronie odniesienia (lub w tym), nie jest to wymagane. Każdy indeks dodać spowalnia operacje DML lekko w dół, więc płacisz koszt wykonania na każdym INSERT
, UPDATE
lub DELETE
. Jeśli indeks jest rzadko używany, nie warto go mieć.
Jeśli chcesz wyświetlić listę indeksów wszystkich tabel w schemacie (ach) z twojego programu, wszystkie informacje są dostępne w katalogu:
Jeśli chcesz zagłębić się dalej (takie jak kolumny i kolejność), musisz spojrzeć na pg_catalog.pg_index. Korzystanie
psql -E [dbname]
przydaje na zastanawianie się, jak kwerendy katalogu.źródło
\di
wyświetli również wszystkie indeksy w bazie danych”. (komentarz skopiowany z innej odpowiedzi, dotyczy również tutaj)To zapytanie wyświetli brakujące indeksy kluczy obcych , oryginalne źródło .
Edycja : Pamiętaj, że nie sprawdzi małych tabel (mniej niż 9 MB) i niektórych innych przypadków. Zobacz końcowe
WHERE
oświadczenie.źródło
where
klauzule: Między innymi bierze pod uwagę tylko tabele, których rozmiar jest większy niż 9 MB.Tak - dla kluczy podstawowych, nie - dla kluczy obcych (więcej w dokumentacji ).
w „psql” pokazuje opis tabeli zawierający wszystkie jej indeksy.
źródło
Uwielbiam to, jak to wyjaśniono w artykule Fajne funkcje wydajnościowe EclipseLink 2.5
źródło
Dla a
PRIMARY KEY
zostanie utworzony indeks z następującym komunikatem:Dla
FOREIGN KEY
, ograniczenie nie zostanie utworzony, jeśli nie ma indeks na referenc ed tabeli.Indeks na referenc ing tabeli nie jest wymagane (choć konieczne), a zatem nie będzie domyślnie tworzony.
źródło