Chciałbym uzyskać kolumny, w których znajduje się indeks w PostgreSQL.
W MySQL możesz używać SHOW INDEXES FOR table
i przeglądać Column_name
kolumnę.
mysql> show indexes from foos;
+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| foos | 0 | PRIMARY | 1 | id | A | 19710 | NULL | NULL | | BTREE | |
| foos | 0 | index_foos_on_email | 1 | email | A | 19710 | NULL | NULL | YES | BTREE | |
| foos | 1 | index_foos_on_name | 1 | name | A | 19710 | NULL | NULL | | BTREE | |
+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
Czy coś takiego istnieje dla PostgreSQL?
Próbowałem \d
w psql
wierszu polecenia (z -E
opcją pokazania SQL), ale nie wyświetla informacji, których szukam.
Aktualizacja: Dziękujemy wszystkim, którzy dodali swoje odpowiedzi. cope360 dał mi dokładnie to, czego szukałem, ale kilka osób zaglądało z bardzo przydatnymi linkami. Do wykorzystania w przyszłości zajrzyj do dokumentacji pg_index (przez Milena A. Radeva ) i bardzo przydatnego artykułu Ekstrakcja informacji META z PostgreSQL (przez Michała Niklasa ).
sql
postgresql
indexing
Luke Francl
źródło
źródło
Odpowiedzi:
Utwórz dane testowe ...
Lista indeksów i indeksowanych kolumn:
Zwinąć nazwy kolumn:
źródło
and t.relname like 'test%'
wiersz na żądane tabele lub całkowicie usuń ten wiersz, aby znaleźć wszystkie indeksy w bazie danych.relkind='r'
to znaczy?r = ordinary table, i = index, S = sequence, v = view, c = composite type, t = TOAST table
.ix.indisunique
PostgreSQL ( pg_indexes ):
MySQL ( POKAŻ INDEKS ):
źródło
SELECT COUNT(indexname) AS indexcount FROM pg_indexes WHERE tablename='mytablename' AND indexdef LIKE '%mycolumnname%' ;
i zweryfikujindexcount>0
. mySQL:SHOW INDEX FROM mytablename WHERE Column_name='mycolumnname' ;
i sprawdź, czy zestaw wyników nie jest pusty.pg_indexes
widok nie zawiera nazw kolumn. postgresql.org/docs/current/view-pg-indexes.html\d table_name
pokazuje te informacjepsql
, ale jeśli chcesz uzyskać takie informacje z bazy danych za pomocą SQL, spójrz na Wydobywanie informacji META z PostgreSQL .Używam takich informacji w moim narzędziu do zgłaszania niektórych informacji ze schematu db do porównywania baz danych PostgreSQL w środowisku testowym i produkcyjnym.
źródło
\d table
nie wyświetla żadnych indeksów, ale\di
pokazuje wszystkie indeksy.\t
). Przy włączonej opcji „tylko krotki” nie otrzymuję indeksów\d
, a przy opcji „tylko krotki” wyłączone. Dotyczy to psql (PostgreSQL) 9.6.15.Po prostu zrób:
\d table_name
Ale nie jestem pewien, co masz na myśli, że nie ma tam informacji o kolumnach.
Na przykład:
Wyraźnie pokazuje, które kolumny mają indeks w tej tabeli.
źródło
\d index_name
ma informacje. Więc mogę sprawdzić indeksy w tabeli, a następnie sprawdzić szczegóły. Nie pokazując kolumn mam na myśli, że spojrzałem na SQL wygenerowany według\d table
nazwy i nie jest dla mnie oczywiste, skąd pochodzi lista kolumn. Myślę, że jest on analizowany na podstawie definicji indeksu, czego wolałbym nie robić.\d table
nie wyświetla żadnych indeksów, ale\di
pokazuje wszystkie indeksy.# \di
Najłatwiejszym i najkrótszym sposobem jest
\di
wyświetlenie wszystkich indeksów w bieżącej bazie danych.\di
jest „mały brat” z\d
polecenia, które wyświetli wszystkie kontakty bieżącego d atabase. Zatem\di
z pewnością stać na „pokaż mi to d atabases i ndexes”.Wpisanie
\diS
spowoduje wyświetlenie wszystkich indeksów używanych w całym systemie, co oznacza, że otrzymasz także wszystkie indeksy pg_catalog.Za pomocą obu tych poleceń możesz dodać
+
po nim, aby uzyskać jeszcze więcej informacji, takich jak rozmiar potrzebnego miejsca na dysku, a także opis, jeśli jest dostępny.W psql można łatwo znaleźć pomoc dotyczącą pisania poleceń
\?
.źródło
W połączeniu z innymi kodami i stworzył widok:
źródło
Niektóre przykładowe dane ...
Użyj
pg_get_indexdef
funkcji:źródło
To polecenie pokazuje także widok zmiennych tabeli, indeksów i ograniczeń
Przykład:
źródło
\d tablename
pokazuje mi nazwy kolumn w wersji 8.3.8.źródło
WYNIK ZAPYTANIA:
PYTANIE:
źródło
Nieprzetworzone informacje znajdują się w pg_index .
źródło
indkey
: „Jest to tablica wartości indnatts wskazujących, które kolumny tabeli indeksuje ten indeks. Na przykład wartość 1 3 oznaczałaby, że pierwsza i trzecia kolumna tabeli tworzą klucz indeksu. Zero w tej tablicy wskazuje, że odpowiadający atrybut indeksu jest wyrażeniem nad kolumnami tabeli, a nie prostym odniesieniem do kolumny ”Jeśli chcesz zachować kolejność kolumn w indeksie, oto (bardzo brzydki) sposób:
kolejność kolumn jest przechowywana w kolumnie pg_index.indkey, więc uporządkowałem według indeksów z tej tablicy.
źródło
Podczas zabawy z indeksami kolejność budowania kolumn w indeksie jest równie ważna jak same kolumny.
Poniższe zapytanie zawiera listę wszystkich indeksów dla danej tabeli i wszystkich ich kolumn w posortowany sposób.
źródło
i
dla ordinality jest bardzo śliski. Zapewnia to, że kolumny są podane we właściwej kolejności.Wypróbuj poniższe zapytanie, aby przejść do wymaganych indeksów
źródło
źródło
Oto funkcja, która otacza odpowiedź cope360:
Stosowanie:
źródło
A może proste rozwiązanie:
`
źródło
'^[^\)]*\(([^\)]*)\).*$'
Doskonała odpowiedź @ cope360, przekonwertowana na składnię łączenia.
źródło
Nie sądzę, aby ta wersja istniała jeszcze w tym wątku: zawiera ona zarówno listę nazw kolumn, jak i ddl dla indeksu.
Odkryłem, że indeksy korzystające z funkcji nie łączą się z nazwami kolumn, więc od czasu do czasu można znaleźć listę indeksów, np. Nazwę jednej kolumny, gdy w rzeczywistości używana jest 3.
Przykład:
Zapytanie zwraca tylko „col3” jako kolumnę w indeksie, ale DDL pokazuje pełny zestaw kolumn używanych w indeksie.
źródło
Rozszerz na dobrą odpowiedź na @ Cope360. Aby uzyskać dla określonej tabeli (należy dodać, że ma taką samą nazwę, ale inny schemat), wystarczy użyć OID tabeli.
Wyjaśnij: Mam nazwę tabeli „tbassettype” zarówno w schemacie „dbAsset”, jak i „dbLegal”. Aby uzyskać tylko tabelę na dbLegal, po prostu pozwól a.attrelid = jego OID.
źródło
Trochę zmodyfikowana odpowiedź @ cope360:
Spowoduje to wyświetlenie kolumn indeksu we właściwej kolejności:
źródło
źródło
Odpowiedź zaakceptowana przez @ cope360 jest dobra, ale chciałem czegoś bardziej jak Oracle DBA_IND_COLUMNS, ALL_IND_COLUMNS i USER_IND_COLUMNS (np. Raportuje schemat tabeli / indeksu i pozycję indeksu w indeksie wielokolumnowym), więc dostosowałem zaakceptowany odpowiedz na to:
Daje to wynik taki jak:
źródło