[Pgsql-ayuda] AYUDA SOBRE INDICES

Alvaro Herrera alvherre@dcc.uchile.cl
Tue, 15 Jul 2003 20:17:20 -0400


On Tue, Jul 15, 2003 at 10:47:14AM -0500, Fabian Mendoza wrote:
> Ya que he obtenido excelentes resultados con Postgres sobre un sistema
> mediano, estoy en la grata tarea de migrar un sistema completo de
> Credito de SQLServer.......
> 
> Agradeceria me ayudaran, con alguna direccion u orientacion sobre el
> manejo optimo de los indices en la base, por ejemplo, la repercusion
> del tipo de dato, de la cantidad de indices simples, de la eficacia de
> un indice simple sobre un indice compuesto, etc.

Postgres sabe usar indices multicolumna para consultas que usen menos
columnas que las que define el indice.  IOW, si defines un indice en 
(a, b, c) y luego haces una consulta sobre (a, b, c), existe la
posibilidad de usar el indice; tambien existe si la consulta es sobre 
(a, b) y sobre solo (a).  No existe si la consulta es sobre (a, c, b) o
sobre (b, c).

Ahora, tampoco es buena idea poner mas campos de los necesarios en el
indice, puesto que disminuye su efectividad.  Es decir, escoge la menor
cantidad de campos que cubra todas las columnas que necesitas indexar.

Los indices en tipos de largo fijo son mas rapidos que sobre tipos de
largo variable.  Evita, si puedes, usar indices sobre columnas char(),
varchar(), numeric(), text(), etc.  Seguramente tampoco tiene demasiado
sentido hacer indices sobre float, pero depende de la aplicacion.

Es importante tener en cuenta la utilidad de los indices parciales
(CREATE INDEX ... WHERE algo); pueden ser muy utiles en casos donde la
porcion buscada de la tabla es significativamente pequeña respecto de la
tabla completa.  OTOH no creo que valga la pena tener dos indices que
cubran aprox. 50% de la tabla cada uno...

Tambien te pueden servir indices funcionales.

Manten siempre las estadisticas actualizadas (ANALYZE / VACUUM ANALYZE)

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
Voy a acabar con todos los humanos / con los humanos yo acabaré
voy a acabar con todos / con todos los humanos acabaré (Bender)