2011-09-05 15 views
6

¿Cómo hago para administrar los índices de mi base de datos en Heroku? Sé sobre los grifos, pero parece ser para empujar/tirar datos.Administrar índices db en heroku

¿Cómo veo, actualizo y elimino mis índices? Mi dev db es sqlite3 mientras que en Heroku es postgres.

+0

Es el postgres de $ 15/mes, 20 gigas. No estoy seguro si es compartido o dedicado. – Brand

Respuesta

1

Parece que está utilizando una base de datos compartida en lugar de dedicada, por lo que tiene que hacerlo de la manera difícil. Si tiene una base de datos dedicada, entonces puede heroku pg:psql y luego \di and assorted other psql commands para obtener lo que está buscando.

Sin embargo, siempre existe la manera más difícil y eso involucra las tablas de catálogo interno. Hay pocos fragmentos de SQL que necesitará, puede envolverlos en llamadas ActiveRecord::Base.connection.select_rows y acceder a los resultados desde la consola de Rails.

Usted puede obtener una lista de sus tablas y sus índices con esto:

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 

continuación, puede utilizar la index_oid para obtener una descripción del índice en cuestión con esto:

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}' 

O puede usar el table_oid para obtener una lista de índices para esa tabla con esto:

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 

Usted probablemente querrá para envolver todo esto en una clase de utilidad para facilitar el acceso:

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 

No he probado esto con una base de datos compartida en Heroku (lo siento, sólo tengo una base de datos dedicada para jugar con). Puede haber formas más sencillas pero estas deberían hacer el trabajo y serán fáciles de usar si las finaliza en una clase de PGInfo.

Todo lo que le da la información de índice que necesita, entonces puede usar las migraciones normales para agregar, eliminar o modificar sus índices.

+0

gracias por la respuesta muy completa – Brand

+0

@Marca: De nada, de hecho uso las respuestas para guardar notas para mí algunas veces :) –

1

Debe gestionar sus índices a través de sus migraciones, para que estén sincronizados en todos sus entornos.

+0

esto no me permite VER mis índices aunque lo haga? o ¿estás hablando de mirar el schema.rb? – Brand

+0

Bien, podrías grep add_index en todas tus migraciones si quisieras también, pero el schema.rb es el lugar para ir a ver. No sé de una mejor manera, y creo que hacer algo específico de heroku irá por el camino de permitirle hacer cambios en su esquema de base de datos de producción de una manera que será desagradable en el futuro. – spike

Cuestiones relacionadas