2011-09-05 18 views
6

Come faccio a gestire gli indici dei miei database su Heroku? So di rubinetti, ma sembra essere per spingere/tirare i dati.Gestione degli indici db su heroku

Come visualizzare, aggiornare, eliminare i miei indici? Il mio dev db è sqlite3 mentre su Heroku è postgres.

+0

Sono gli $ 15/mese postgres, 20 concerti. Non sono sicuro se è condiviso o dedicato. – Brand

risposta

1

Sembra che tu stia utilizzando un database condiviso piuttosto che dedicato, quindi devi farlo nel modo più difficile. Se disponi di un database dedicato, puoi ottenere heroku pg:psql e poi \di and assorted other psql commands per ottenere quello che stai cercando.

C'è sempre il modo difficile però e che coinvolge le tabelle del catalogo interno. Ci sono alcuni blocchi di SQL che ti serviranno, puoi metterli nelle chiamate ActiveRecord::Base.connection.select_rows e accedere ai risultati dalla tua console di Rails.

È possibile ottenere un elenco delle tabelle e dei loro indici con questo:

select c2.relname as table, c2.oid as table_oid, c.relname as name, c.oid as index_oid 
from pg_catalog.pg_class c 
join pg_catalog.pg_index i on i.indexrelid = c.oid 
join pg_catalog.pg_class c2 on i.indrelid = c2.oid 
left join pg_catalog.pg_user u on u.usesysid = c.relowner 
left join pg_catalog.pg_namespace n on n.oid = c.relnamespace 
where c.relkind = 'i' 
    and n.nspname <> 'pg_catalog' 
    and pg_catalog.pg_table_is_visible(c.oid) 
order by c2.relname, c.relname 

quindi è possibile utilizzare il index_oid per ottenere una descrizione dell'indice in questione con questo:

select c.relname, c.oid, i.indisprimary, i.indisunique, i.indisclustered, i.indisvalid, pg_catalog.pg_get_indexdef(i.indexrelid, 0, true), c.reltablespace 
from pg_catalog.pg_class c 
join pg_catalog.pg_index i on c.oid = i.indexrelid 
where c.oid = '#{index_oid}' 

Oppure è possibile utilizzare lo table_oid per ottenere un elenco di indici per tale tabella con questo:

select ci.relname, ci.oid, i.indisprimary, i.indisunique, i.indisclustered, i.indisvalid, pg_catalog.pg_get_indexdef(i.indexrelid, 0, true), ci.reltablespace 
from pg_catalog.pg_index i 
join pg_catalog.pg_class ci on i.indexrelid = ci.oid 
where i.indrelid = '#{table_oid}' 
order by ci.relname 

che vorreste probabilmente per avvolgere tutta questa roba in una classe di utilità per un facile accesso:

class PGInfo 
    def self.list_indexes 
     data = ActiveRecord::Base.connection.select_rows(%Q{ 
      select c2.relname as table, c.relname as name, c.oid as oid 
      ... 
     }) 
     # do something pretty with the array of arrays that is in data 
    end 
    # etc. 
end 

Non ho provato questi con un database condiviso a Heroku (scusate, ho solo un database dedicato per giocare con). Ci potrebbero essere modi più semplici ma questi dovrebbero portare a termine il lavoro e saranno facili da usare se li avvolgi in una classe PGInfo.

Tutto ciò che fornisce le informazioni sull'indice necessarie, quindi è possibile utilizzare le normali migrazioni per aggiungere, rimuovere o modificare gli indici.

+0

grazie per la risposta molto accurata – Brand

+0

@ Brand: Prego, in realtà uso le risposte per mantenere le note per me a volte :) –

1

È necessario gestire gli indici tramite le migrazioni, in modo che siano sincronizzati tra gli ambienti.

+0

questo non mi permette di vedere i miei indici che lo fa? o stai parlando dello schema.rb? – Brand

+0

Bene, potresti aggiungere add_index in tutte le tue migrazioni, se lo volessi, ma lo schema.rb è il posto dove andare per vedere. Non conosco un modo migliore, e penso che fare qualsiasi cosa specifica per heroku passi lungo il percorso consentendo di apportare modifiche allo schema del database di produzione in un modo che sarà brutto lungo la strada. – spike

Problemi correlati