2011-01-25 19 views
23

Sto usando psql per accedere a un database postgres. Quando si visualizzano i metadati di una tabella, esiste un modo per vedere se un indice di una tabella è un indice cluster?Informazioni sull'indice cluster in postgres

Ho sentito che la PRIMARY KEY di una tabella viene automaticamente associata a un indice cluster, è vero?

+2

PostgreSQL non ha un indice cluster, ma perché pensi che sarebbe interessante? Hai un problema da risolvere? –

+7

Nessun problema particolare da risolvere. Sto solo imparando a postgre :-) – zzhang

+0

mi sarei chiesto perché le mie tabelle non si deframmentassero automaticamente se non fosse per questa domanda –

risposta

12

C'è un modo per vedere se un indice di una tabella è un indice cluster

PostgreSQL non dispone di un indice cluster, in modo da non essere in grado di vederli.

Ho sentito che la PRIMARY KEY di una tabella viene automaticamente associata a un indice cluster, è vero?

No, non è vero (vedi sopra)

È possibile raggruppare manualmente un tavolo lungo un indice, ma questo non è altro che sarà mantenuta automaticamente (come per esempio con gli indici cluster di SQL Server).

Per ulteriori dettagli, consultare la descrizione del comando CLUSTER nel manuale.

+0

Quindi posso usare \ d per stabilire se una tabella è raggruppata in un indice? – zzhang

+0

'\ dS +' dovrebbe farlo se leggo il manuale correttamente. Basta controllare l'aiuto e giocare con gli optioin. –

25

Si noti che PostgreSQL utilizza il termine "indice cluster" per utilizzare qualcosa di vagamente simile e tuttavia molto diverso da SQL Server.

Se un determinato indice è stato nominato come indice di clustering per un tavolo, allora il comando di psql \d indicherà l'indice cluster, ad esempio,

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

PostgreSQL non nominare indici come indici di clustering di default. Inoltre, non ordina automaticamente i dati della tabella in correlazione con l'indice cluster anche se così nominati: il comando CLUSTER deve essere utilizzato per riorganizzare i dati della tabella.

15

In PostgreSQL l'attributo cluster è contenuto nei metadati dell'indice corrispondente, piuttosto che nella relazione stessa. È l'attributo indisclustered nel catalogo pg_index. Si noti, tuttavia, che le relazioni di clustering all'interno di postgres sono azioni una tantum: anche se l'attributo è true, gli aggiornamenti alla tabella non mantengono la natura ordinata dei dati. Ad oggi, la manutenzione automatica del clustering dei dati rimane un popolare elemento TODO.

C'è spesso confusione tra raggruppati e integrati indici, in particolare dal momento che i libri di testo popolari usano nomi in conflitto, e la terminologia è di nuovo diverso nei manuali di Postgres e SQL Server (per citarne solo due). Quando parlo di un indice integrato (chiamato anche indice principale o indice primario) intendo quello in cui i dati relazione è contenuta nelle foglie dell'indice, anziché un esterna o secondaria indice in cui le foglie contengono voci di indice che puntano ai record della tabella. Il primo tipo è necessariamente sempre in cluster. Purtroppo postgres supporta solo il secondo tipo.Ad ogni modo, il fatto che un indice (primario) integrato sia sempre cluster potrebbe aver dato origine alla convinzione che "una CHIAVE PRIMARIA di una tabella viene automaticamente associata a un indice cluster". Le due affermazioni suonano simili, ma sono diverse.

+1

Credo che SQL Server faccia in modo che le chiavi primarie utilizzino un indice cluster per impostazione predefinita, a meno che non dite altrimenti, giusto? Ciò può portare a confusione o portare a presupporre che i due significhi necessariamente la stessa cosa. – Brandon

+1

Sì, secondo http://msdn.microsoft.com/en-us/library/ms174979.aspx "I vincoli PRIMARY KEY sono impostati su CLUSTERED e i vincoli UNIQUE sono impostati su NONCLUSTERED." – beldaz

2

PostgreSQL non ha implementazione diretta dell'indice CLUSTER come Microsoft SQL Server.

Reference Taken from this Blog:

In PostgreSQL, abbiamo un comando CLUSTER che è simile al cluster indice.

Dopo aver creato la chiave primaria della tabella o qualsiasi altro indice, è possibile eseguire il comando CLUSTER specificando il nome dell'indice per ottenere l'ordine fisico dei dati della tabella.

Quando una tabella è raggruppata, viene fisicamente riordinata in base alle informazioni dell'indice. Il clustering è un'operazione una tantum: quando la tabella viene successivamente aggiornata, le modifiche non sono raggruppate in cluster. Cioè, non viene fatto alcun tentativo di memorizzare righe nuove o aggiornate in base al loro ordine di indice.

Sintassi di Cluster:

prima volta che si deve eseguire cluster utilizzando il nome di Index.

CLUSTER table_name USING index_name; 

Cluster tabella:

Una volta che avete eseguito CLUSTER con Index, la prossima volta che si deve eseguire solo TABELLA CLUSTER perché sa che che indice già definito come CLUSTER.

CLUSTER table_name; 
1

Se vuoi sapere se una determinata tabella è CLUSTER ed utilizzando SQL, è possibile utilizzare la seguente query per mostrare l'indice in uso (testate nelle versioni Postgres 9.5 e 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

l'istruzione sql fornita non ha funzionato –

+0

@ DanielL.VanDenBosch, qual era l'errore? Ho appena ricontrollato funziona per me (e ho chiarito la versione postgres nella mia risposta). – seb