Digamos que tengo una tabla con campos Ay B. Hago consultas regulares en A+ B, así que creé un índice compuesto en (A,B). ¿Las consultas en solo Atambié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 analyzetexto 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
integercolumnas (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 oUNIQUErestricción. Desde Postgres 11, puede salirse con solo agregarba la definición de restricción con laINCLUDEcláusula. Detalles en el manual.O cree el nuevo índice en su
(b,a)lugar para cubrir consultas solobadicionalmente. 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=Bes efectivamente lo mismoB IS NOT NULLque parece innecesario. Ciertamente no es necesario usar un índice en(a,b).