2011-01-25 11 views
23

Używam psql do dostępu do bazy danych PostgreSQL. Czy podczas wyświetlania metadanych tabeli istnieje sposób sprawdzenia, czy indeks tabeli jest indeksem klastrowym?O indeksie klastrowym w postgresie

Słyszałem, że KLUCZ PRIMARY tabeli jest automatycznie skojarzony z indeksem klastrowym, czy to prawda?

+2

PostgreSQL nie ma indeksu klastrowego, ale dlaczego uważasz, że byłoby to interesujące? Czy masz problem do rozwiązania? –

+7

Brak konkretnego problemu do rozwiązania. Po prostu dowiedziałem się o postgre :-) – zzhang

+0

Zastanawiałbym się, dlaczego moje tabele nie są automatycznie defragmentowane, jeśli nie było to dla tego pytania. –

Odpowiedz

12

jest jakiś sposób, aby sprawdzić, czy indeks tabeli jest indeks klastrowany

PostgreSQL nie posiada indeksu klastrowego, więc nie będą mogli je zobaczyć.

Słyszałem, że KLUCZ PRIMARY tabeli jest automatycznie skojarzony z indeksem klastrowym, czy to prawda?

Nie, to nie prawda (patrz wyżej)

Można ręcznie klastra stolik wzdłuż indeksu, ale to nic, że automatycznie zostanie utrzymany (jak na przykład z skupionych indeksów SQL Server). Aby uzyskać więcej informacji, zobacz opis polecenia CLUSTER w instrukcji.

+0

Następnie mogę użyć \ d, aby stwierdzić, czy tabela jest zgrupowana wzdłuż indeksu? – zzhang

+0

'\ dS +' powinno to zrobić, jeśli poprawnie przeczytam instrukcję. Po prostu sprawdź pomoc i baw się z opioidami. –

25

Należy zauważyć, że PostgreSQL używa terminu "indeks klastrowy", aby użyć czegoś nieco podobnego, a jednak bardzo odmiennego od SQL Server.

Jeśli dany Indeks został nominowany jako indeksu klastrowego w tabeli, a następnie \d polecenie psql będzie wskazywać indeksu klastrowego, np

Indexes: 
    "timezone_description_pkey" PRIMARY KEY, btree (timezone) CLUSTER 

PostgreSQL nie nominować indeksów jak indeksy klastrów domyślnie. Nie powoduje również automatycznego rozmieszczenia danych tabeli w celu korelacji z indeksem klastrowym, nawet jeśli tak wyznaczono: komenda CLUSTER musi zostać użyta do reorganizacji danych tabeli.

15

W klastrze PostgreSQL atrybut klastrowany jest przechowywany w metadanych odpowiedniego indeksu, a nie w samej relacji. Jest to atrybut indisclustered w katalogu pg_index. Zauważ jednak, że relacje klastrowania w postgresach są działaniem jednorazowym: nawet jeśli atrybut jest prawdziwy, aktualizacje tabeli nie zachowują posortowanej natury danych. Do tej pory automatyczna konserwacja klastrów danych pozostaje popularnym elementem o nazwie TODO.

Jest często mylone skupione i zintegrowanych indeksów, zwłaszcza że popularne podręczniki wykorzystywać konflikt nazw, a inna terminologia jest ponownie w podręcznikach PostgreSQL i serwera SQL (by wymienić tylko dwa). Kiedy mówię o zintegrowanym wskaźnikiem (zwanego również główny indeks lub podstawowy wskaźnik) To znaczy jeden, w którym dane relacja jest zawarty w liściach indeksie, a nie jest zewnętrzny lub wtórnego indeks, w którym liście zawierają pozycje indeksu wskazujące na rekordy tabeli. Poprzedni typ zawsze musi być skupiony. Niestety Postgres obsługuje tylko ten ostatni typ.W każdym razie fakt, że zintegrowany (pierwotny) indeks jest zawsze klastrowany może spowodować przekonanie, że "klucz podstawowy tabeli jest automatycznie powiązany z indeksem klastrowym". Te dwa stwierdzenia brzmią podobnie, ale są różne.

+1

Wierzę, że SQL Server sprawia, że ​​klucze podstawowe używają domyślnie indeks klastrowany, chyba że powiesz inaczej, prawda? Może to prowadzić do nieporozumień lub prowadzić do założenia, że ​​oba muszą oznaczać to samo. – Brandon

+1

Tak, zgodnie z http://msdn.microsoft.com/en-us/library/ms174979.aspx "OGRANICZENIE PODSTAWOWEJ KLUCZY jest domyślnie OGLĄDANE, a ograniczenia UNIQUE domyślnie NIE ZOSTANĄ POKRYTE." – beldaz

2

PostgreSQL nie ma bezpośredniej implementacji indeksu CLUSTER takiego jak Microsoft SQL Server.

Reference Taken from this Blog:

W PostgreSQL, mamy jednego polecenia klastra, który jest podobny do Cluster Index.

Po utworzeniu klucza podstawowego tabeli lub dowolnego innego indeksu można wykonać polecenie CLUSTER, określając nazwę indeksu w celu uzyskania fizycznej kolejności danych tabeli.

Gdy tabela jest klastrowana, jest fizycznie porządkowany na podstawie informacji indeksu. Clustering jest operacją jednorazową: gdy tabela jest następnie aktualizowana, zmiany nie są grupowane. Oznacza to, że nie są podejmowane żadne próby przechowywania nowych lub zaktualizowanych wierszy zgodnie z ich kolejnością indeksowania.

Składnia Klastra:

Pierwszy raz trzeba wykonać klastra przy użyciu nazwę indeksu.

CLUSTER table_name USING index_name; 

Cluster tabela:

Po wykonywane klaster Index, następnym razem należy wykonać jedynym klastrem TABLE, ponieważ wie, że wskaźnik, który już zdefiniowany jako klaster.

CLUSTER table_name; 
1

Jeśli chcesz wiedzieć, czy dana tabela jest CLUSTER ed za pomocą SQL, można użyć następującego zapytania, aby pokazać indeks używany (testowane w PostgreSQL wersjach 9.5 i 9.6):

SELECT 
    i.relname AS index_for_cluster 
FROM 
    pg_index AS idx 
JOIN 
    pg_class AS i 
ON 
    i.oid = idx.indexrelid 
WHERE 
    idx.indisclustered 
    AND idx.indrelid::regclass = 'your_table_name'::regclass; 
+0

Podane przez ciebie polecenie sql nie zadziałało –

+0

@ DanielL.VanDenBosch, jaki był błąd? Właśnie sprawdziłem, czy to działa dla mnie (i wyjaśniłem wersję postgres w mojej odpowiedzi). – seb

Powiązane problemy