Digamos que tengo una tabla con campos A
y B
. Hago consultas regulares en A
+ B
, así que creé un índice compuesto en (A,B)
. ¿Las consultas en solo A
también se optimizarán completamente mediante el índice compuesto?
Además, creé un índice A
, pero Postgres todavía usa el índice compuesto solo para consultas A
. Si la respuesta anterior es positiva, supongo que realmente no importa, pero ¿por qué selecciona el índice compuesto de forma predeterminada, si el A
índice único está disponible?
explain analyze
texto y el de la consulta?Respuestas:
Ciertamente lo es. Discutimos eso en gran detalle bajo esta pregunta relacionada:
El espacio se asigna en múltiplos de
MAXALIGN
, que normalmente es de 8 bytes en un sistema operativo de 64 bits o (mucho menos común) 4 bytes en un sistema operativo de 32 bits. Si no está seguro, verifiquepg_controldata
. También depende de los tipos de datos de las columnas indexadas (algunas requieren relleno de alineación) y el contenido real.Un índice en, digamos, dos
integer
columnas (4 bytes cada una) generalmente termina siendo exactamente tan grande como un índice en solo una, donde otros 4 bytes se pierden en el relleno de alineación.En tal caso, realmente no hay inconveniente para que el planificador de consultas use un índice activado, en
(a,b)
comparación con un índice solo(a)
. Y generalmente es preferible que múltiples consultas usen el mismo índice. La posibilidad de que (o partes de ella) resida en caché (rápido) aumenta cuando se comparte.Si ya mantiene un índice activado
(a,b)
, entonces no tiene sentido crear otro índice solo(a)
, a menos que sea sustancialmente más pequeño. Lo mismo no ocurre con(b,a)
vs(a)
. Siga el enlace en la primera línea para obtener más información al respecto.Viniendo desde la dirección opuesta, cuando necesite un índice adicional como ese
(a,b)
, considere colocar un índice existente solo(a)
, si es posible. A menudo no es posible, ya que ese es el índice de una PK oUNIQUE
restricción. Desde Postgres 11, puede salirse con solo agregarb
a la definición de restricción con laINCLUDE
cláusula. Detalles en el manual.O cree el nuevo índice en su
(b,a)
lugar para cubrir consultas solob
adicionalmente. Solo para condiciones de igualdad, el orden de las expresiones de índice en los índices btree no importa. Sin embargo, lo hace cuando involucra condiciones de rango. Ver:Existen posibles desventajas para incluir columnas adicionales en un índice, incluso si eso solo usa espacio perdido de otra manera en el relleno de alineación:
Más sobre actualizaciones CALIENTES:
Cómo medir tamaños de objeto:
fuente
Según su pregunta, tiene una tabla con los campos A y B. Si su consulta es:
¡Optimizer elegirá el índice Compuesto para evitar el acceso aleatorio de Extracción!
fuente
Es en el caso si solo usas primero en el predicado.
Analizará si utiliza las primeras columnas de clave compuesta y la columna sin clave de clave compuesta.
Para engañarlo, puede usar predicados ficticios como este y luego una columna sin clave:
[A, B] es su índice, [C] - otra columna
Para utilizar el índice, escriba como:
Utilizará el índice solo en el caso si hay uno o dos predicados [A] o [A], [B]. No lo usará en el orden [B], [A] o [A], [C]. Para poder utilizar el índice con la columna adicional [C], debe aplicar el índice ordenando predicados como [A], [B] y [C].
fuente
B=B
? Creo que no logras nada, así que voy a rechazar cualquier evidencia que el optimizador no ignoreB=B
es efectivamente lo mismoB IS NOT NULL
que parece innecesario. Ciertamente no es necesario usar un índice en(a,b)
.