Mejorando la performance de PostgreSQL con índices parciales
alfredo publicó esto el 28/09/09 en Bases de Datos. Un comentarioUna característica poco conocida pero muy útil de PostgreSQL es la posibilidad de crear índices parciales, la mayor motivación de estos índices es evitar indexar valores comunes, esto reduce su tamaño lo cual acelerará las búsquedas que usen el índice. También acelerará muchas operaciones de actualización porque el índice no necesita ser actualizado en todos los casos.
Tomemos un ejemplo simplificado de la vida real, supongamos que tenemos una tabla de afiliados de una obra social. En esta tabla tenemos a los titulares y a los familiares de los titulares, los cuales acceden a los mismos servicios que los titulares. Si suponemos que cada titular tiene en promedio 2 o 3 familiares asociados y si nuestras búsquedas se realizan principalmente sobre los titulares, probablemente no necesitemos indexar a los familiares.
Asumimos que tenemos la siguiente tabla:
CREATE TABLE afiliados ( id SERIAL PRIMARY KEY, nombre VARCHAR(60), tipo_afiliado VARCHAR(20), monto_cuota REAL, monto_deuda REAL, ..... );
Siguiendo con el ejemplo para crear un índice solo para los afiliados titulares, usamos la siguientes sentencia
CREATE INDEX idx_afiliados_titulares ON afiliados(tipo_afiliado) WHERE tipo_afiliado = 'Titular';
Una típica consulta que utilizará este índice es:
SELECT nombre FROM afiliados WHERE tipo_afiliado = 'Titular';
Ahora veamos otro ejemplo, si habitualmente consultamos aquellos afiliados que pagan una cuota superior a $50 para brindarle promociones o precios diferenciales podemos crear el siguiente índice parcial:
CREATE INDEX idx_afiliados_buenos_afiliados ON afiliados(monto_couta) WHERE monto_couta >= 50;
La siguiente es una consulta que utilizará el índice parcial:
SELECT nombre FROM afiliados WHERE monto_cuota = 55;
Para más información y ejemplos podemos ver la documentación oficial de PostgreSQL.
Buenos dias,
Publicado el 30 Septiembre 2011 a las 11:19. Permalink.muy buen post, me ha sido util, actualmente tengo una tabla con el nombre kardex con mas de 1 millon de registros ya que guarda los movimientos de los producos por codigo de barra de los mismos, quisiera saber si me recomiendas usar indices en mi columna codigo de barra la cual se puede repetir mas de 1 vez por cada codigo de barra por los movimientos que el articulo pueda tener, adicionalmente estos codigos de barra son entre 8 a 18 digitos, estos datos se encuentran en una columna de tipo charactervaring.
Quisiera saber que tan beneficioso seria aplicar indices en este caso ya que algunos dicen que haria mas pesada a mi tabla y bajaria el rendimiento,
Ademas de esto estaba pensando cambiar el tipo de dato de la columna de character varing por un numeric (18,0), pero que me recomiendas, espero puedas ayudarme y gracias nuevamente por el post.