El optimizador de consultas de Firebird es muy bueno y en casi la totalidad de los casos elegirá la mejor alternativa: cual de los índices usar o no usar un índice.

Sin embargo no es perfecto y alguna vez podrías descubrir que está usando un índice cuando no debería hacerlo. Esto en general ocurre cuando el índice tiene poca selectivdad (es decir: muchos valores repetidos).

Puedes saber cual índice se usa en una consulta mirando el PLAN de la misma.

Si descubres que usando un índice obtienes los resultados a una cierta velocidad (por ejemplo: 1500 ms) y sin usarlo obtienes los resultados a una velocidad mayor (por ejemplo: 100 ms) lo que debes hacer es pedirle al Firebird que no use ese índice. Eso lo consigues agregándole a tu SELECT la cláusula PLAN.

Ejemplo:

Queremos obtener los nombres de los proveedores que empiezan con “H”. La tabla de PROVEEDORES tiene un índice según las columnas (PRO_CODSUC y PRO_NOMBRE).

En PRO_CODSUC se guarda el código de la Sucursal.

En PRO_NOMBRE se guarda el nombre del Proveedor.

SELECT
   PRO_NOMBRE
FROM
   PROVEEDORES
WHERE
   PRO_CODSUC = 0 AND
   PRO_NOMBRE LIKE 'H%'
ORDER BY
   PRO_CODSUC,
   PRO_NOMBRE

Verificamos el tiempo que tardó el SELECT en extraer los datos de la tabla de PROVEEDORES y encontramos que es de 1500 ms y que está usando el índice, así que ahora le pedimos que no use el índice:

SELECT
   PRO_NOMBRE
FROM
   PROVEEDORES
WHERE
   PRO_CODSUC = 0 AND
   PRO_NOMBRE LIKE 'H%'
PLAN
   (PROVEEDORES NATURAL)
ORDER BY
   PRO_CODSUC,
   PRO_NOMBRE

y encontramos que el tiempo disminuyó a solamente 100 ms.

Conclusión:

Aunque casi siempre el Firebird hace un muy buen trabajo eligiendo el índice más adecuado para una consulta no debes asumir que siempre será así, a veces puede equivocarse. Para descubrirlo siempre tienes que observar el tiempo de extracción de los datos y si es mayor que 500 ms entonces es casi seguro que el PLAN puede mejorarse. Un buen profesional siempre verifica los tiempos de extracción de los datos y los optimiza al máximo. Esto es de suma importancia cuando las consultas son ejecutadas frecuentemente y las tablas involucradas tienen muchas filas.

Artículos relacionados:

Usando un PLAN

Algo más sobre PLAN

El índice del blog Firebird21

Anuncios