Los índices sirven para dos cosas:
- Mostrar el resultado de los SELECTs ordenados por el criterio que nos interesa
- Realizar búsquedas o filtros, para que solamente sean afectadas las filas que cumplan con la condición que establecimos
Lo más común es que los índices estén compuestos por una o más columnas en forma directa. Veamos un ejemplo:
Captura 1. Si haces clic en la imagen la verás más grande
Captura 2. Si haces clic en la imagen la verás más grande
Tenemos una tabla ALUMNOS y para ordenar a los alumnos por APELLIDOS y por NOMBRES podríamos crear un índice como el siguiente:
Listado 1.
CREATE INDEX IDX_ALUMNOS ON ALUMNOS(ALU_APELLD, ALU_NOMBRE);
Y está muy bien, funcionará perfectamente.
Podríamos escribir entonces un SELECT como el siguiente:
Listado 2.
SELECT * FROM ALUMNOS ORDER BY ALU_APELLD, ALU_NOMBRE
Y así obtendríamos un resultado como este:
Captura 3. Si haces clic en la imagen la verás más grande
Donde como puedes observar, los resultados aparecen ordenados por ALU_APELLD. Pero si queremos saber la diferencia entre ALU_TOTANO y ALU_TOTCOB no es posible usar un índice normal.
¿Y entonces?
Entonces la solución es crear un índice de expresión.
¿Qué es un índice de expresión?
Un índice en el cual se utiliza una expresión aritmética o una expresión alfanumérica o funciones internas.
Ejemplos de índices de expresión:
Listado 3.
CREATE INDEX IDX_ALUMNOS2 ON ALUMNOS COMPUTED BY (LEFT(ALU_APELLD, 1) || LEFT(ALU_NOMBRE, 1)); CREATE INDEX IDX_ALUMNOS3 ON ALUMNOS COMPUTED BY (ALU_TOTANO - ALU_TOTCOB);
Como puedes ver, la diferencia entre el índice creado en el Listado 1. y los índices creados en el Listado 3., es que en estos últimos se escribieron las palabras COMPUTED BY y también se usó la función LEFT() en IDX_ALUMNOS2 y una operación aritmética de resta en IDX_ALUMNOS3.
En todos los índices de expresión se deben escribir las palabras COMPUTED BY, tal como vimos en el Listado 3.
Usando índices de expresión
Algo muy importante a recordar es que cuando usamos índices de expresión debemos usarlos exactamente igual a como los definimos.
Listado 4.
SELECT * FROM ALUMNOS WHERE LEFT(ALU_APELLD, 1) || LEFT(ALU_NOMBRE, 1) = 'KM'
En este caso el Firebird usará el índice IDX_ALUMNOS2 porque la expresión escrita en la cláusula WHERE es la misma expresión usada en la definición del índice IDX_ALUMNOS2.
Listado 5.
SELECT * FROM ALUMNOS WHERE LEFT(ALU_NOMBRE, 1) || LEFT(ALU_APELLD, 1) = 'MK'
En el SELECT del Listado 5. el Firebird no usará el índice IDX_ALUMNOS2 porque la condición escrita en la cláusula WHERE no es igual a la expresión usada en la definición del índice IDX_ALUMNOS2.
Listado 6.
SELECT * FROM ALUMNOS WHERE ALU_TOTANO - ALU_TOTCOB > 1000
En el SELECT del Listado 6. el Firebird usará el índice IDX_ALUMNOS3 porque la condición escrita en la cláusula WHERE es la misma expresión escrita en la definición del índice IDX_ALUMNOS3.
Listado 7.
SELECT * FROM ALUMNOS ORDER BY ALU_TOTANO - ALU_TOTCOB
En el SELECT del Listado 7. también se usará el índice IDX_ALUMNOS3 porque la expresión escrita en la cláusula ORDER BY es la misma expresión que se usó en la definición del índice IDX_ALUMNOS3.
Conclusión:
Los índices de expresión pueden ser muy útiles en algunos casos, es bueno saber que contamos con esta herramienta para poder usarla cuando nos haga falta.
Artículos relacionados:
Optimizando un SELECT que compara columnas de la misma tabla (2)
Comentarios recientes