Tengo una tabla con un índice de varias columnas, y tengo dudas sobre la clasificación adecuada de los índices para obtener el máximo rendimiento en las consultas.
El escenario:
PostgreSQL 8.4, tabla con aproximadamente un millón de filas
Los valores en la columna c1 pueden tener aproximadamente 100 valores diferentes . Podemos suponer que los valores están distribuidos uniformemente, por lo que tenemos alrededor de 10000 filas para cada valor posible.
La columna c2 puede tener 1000 valores diferentes . Tenemos 1000 filas para cada valor posible.
Al buscar datos, la condición siempre incluye valores para estas dos columnas, por lo que la tabla tiene un índice de varias columnas que combina c1 y c2. He leído sobre la importancia de ordenar correctamente las columnas en un índice de varias columnas si tiene consultas utilizando solo una columna para el filtrado. Este no es el caso en nuestro escenario.
Mi pregunta es esta:
Dado el hecho de que uno de los filtros selecciona un conjunto de datos mucho más pequeño, ¿podría mejorar el rendimiento si el primer índice es el más selectivo (el que permite un conjunto más pequeño)? Nunca había considerado esta pregunta hasta que vi los gráficos del artículo referenciado:
Imagen tomada del artículo referenciado sobre índices de varias columnas .
Las consultas usan valores de las dos columnas para el filtrado. No tengo consultas usando solo una columna para filtrar. Todos ellos son: WHERE c1=@ParameterA AND c2=@ParameterB
. También hay condiciones como esta:WHERE c1 = "abc" AND c2 LIKE "ab%"
fuente
Si, como usted dice, las consultas que involucran estas 2 columnas, son todas verificaciones de igualdad de ambas columnas, por ejemplo:
No te molestes con esto. Dudo que haya alguna diferencia y si la hay, será insignificante. Siempre puede probar, por supuesto, con sus datos y la configuración de su servidor. Las diferentes versiones de un DBMS pueden comportarse de manera ligeramente diferente con respecto a la optimización.
El orden dentro del índice sería importante para otros tipos de consultas, verificaciones de una sola columna, o condiciones de desigualdad, o condiciones en una columna y agrupación en la otra, etc.
Si tuviera que elegir una de las dos órdenes, elegiría poner primero la columna menos selectiva. Considere una tabla con columnas
year
ymonth
. Es más probable que necesite unaWHERE year = 2000
condición o unaWHERE year BETWEEN 2000 AND 2013
o unaWHERE (year, month) BETWEEN (1999, 6) AND (2000, 5)
.Una consulta del tipo
WHERE month = 7 GROUP BY year
puede ser segura (Buscar personas nacidas en julio), pero sería menos frecuente. Eso depende, por supuesto, de los datos reales almacenados en su tabla. Elija un pedido por ahora, diga el(c1, c2)
y siempre puede agregar otro índice más adelante(c2, c1)
.Actualización, después del comentario del OP:
Este tipo de consulta es exactamente una condición de rango en la
c2
columna y necesitaría un(c1, c2)
índice. Si también tiene consultas del tipo inverso:entonces sería bueno si tuvieras un
(c2, c1)
índice también.fuente