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, verifique pg_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 o UNIQUE
restricción. Desde Postgres 11, puede salirse con solo agregar b
a la definición de restricción con la INCLUDE
cláusula. Detalles en el manual.
O cree el nuevo índice en su (b,a)
lugar para cubrir consultas solo b
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:
- Cada vez que se actualiza la columna adicional, el índice ahora también necesita una actualización, lo que podría agregar costos para escribir operaciones y crear más hinchazón del índice.
- Las actualizaciones HOT (Tupla de solo almacenamiento dinámico) en la tabla no son posibles mientras esté involucrada cualquier columna de índice.
Más sobre actualizaciones CALIENTES:
Cómo medir tamaños de objeto: