2014-09-21 5 views
5

Ho scritto un semplice script per reindicizzare i nostri database PG una volta alla settimana. Ha una semplice logica:Come ottenere la clausola CREATE INDEX completa per l'indice esistente in puro SQL?

  • ottenere top 10 indici per quantità di byte gonfio
  • ricerca creare clausola indice dalla variabile hashmap (nome di indice -> creare clausola)
    • se non c'è nessuno - accedere al stderr e vai all'indice successivo
  • creare nuovo indice in concomitanza
  • goccia vecchio indice contemporaneamente
  • rinominare nuovo indice

E proprio come sviluppatore pigro non mi piace questo concetto che devo aggiornare costantemente la mia hashmap. (D'altra parte, ho trovato due indici inefficienti mentre lo facevo.)

pg_index sembra abbastanza informativo, c'è un modo per ricostruire una clausola di indice di creazione da esso?

È facile ottenere l'elenco di colonne, ma utilizziamo diversi tipi di indice, diverse classi di campi per indici, indici parziali ... E chissà cosa. È importante assicurarsi che otterremo esattamente la stessa clausola utilizzata per creare l'indice in primo luogo.

risposta

9

Sì, c'è una funzione integrata pg_get_indexdef per lo scopo.

es .:

regress=> SELECT pg_get_indexdef('demo_pkey'::regclass); 
        pg_get_indexdef      
-------------------------------------------------------- 
CREATE UNIQUE INDEX demo_pkey ON demo USING btree (id) 
(1 row) 
+0

E 'davvero un peccato che non c'è una funzione equivalente per la definizione di una tabella ('pg_get_tabledef()' sarebbe davvero utile) –

+0

@a_horse_with_no_name Sì, sono d'accordo. Estremamente forte. Capisco la logica (re downgrade) con fare 'pg_dump' uno strumento lato client, ma la mancanza di esportazione DDL lato server come opzione è molto frustrante. –

+0

Wow! Così felice che esista davvero. Anche conoscendo questa descrizione della funzione non posso facilmente google :) – skaurus

Problemi correlati