Como seguramente sabes, una vista es una consulta (un SELECT) que se guarda dentro de la Base de Datos con dos objetivos principales:

  1. que las consultas que involucren a las filas y a las columnas de la vista sean más rápidas
  2. escribir menos y por lo tanto que el código fuente sea más legible

Pero no todas las consultas (y por consiguiente, no todas las vistas) están optimizadas.

¿Qué significa que una consulta o una vista está optimizada?

Que se ejecuta lo más rápidamente posible

Las consultas que usan varias tablas siempre se pueden escribir de varias formas distintas. Y siempre hay una forma que es mejor que las demás. En este caso la palabra “mejor” se refiere a la velocidad con la cual devuelve las filas. Si escribiendo la consulta de la forma “X” tarda 5 segundos en mostrar sus resultados y escribiendo otra consulta equivalente “Y” tarda 2 minutos, entonces evidentemente la forma “X” es mejor.

Una de nuestras tareas es conseguir que todas las consultas y todas las vistas estén optimizadas.

¿Cómo se puede saber si una consulta está optimizada?

Hasta que tengas mucha experiencia con el tema quizás debas basarte en “prueba y error” pero hay algo que debes tener en cuenta:

  • En prácticamente la totalidad de las consultas optimizadas se usa un índice en cada tabla involucrada

¿Cómo se puede saber si se está usando un índice en cada tabla involucrada?

En general el Firebird utilizará un índice siempre que el nombre de una columna sea escrito en las cláusulas WHERE, JOIN, UNION u ORDER BY y haya un índice compuesto por esa columna.

La frase anterior significa que si tienes un índice compuesto por CLI_CODSUC y CLI_IDENTI, el Firebird usará el índice si escribes ambas columnas o si escribes la primera columna (en este caso: CLI_CODSUC) pero no lo usará si solamente escribes la segunda columna (en este caso: CLI_IDENTI)

¿Hay una forma gráfica de saber si una vista está usando índices en cada tabla?

Sí, los programas de administración gráfica pueden darte esa información, por ejemplo si usas el EMS SQL Manager y creas la siguiente vista:

CREATE VIEW V_ABM_BANCOS(
   BAN_CODSUC,
   BAN_IDENTI,
   BAN_NOMBRE)
AS
SELECT
   BAN_CODSUC,
   BAN_IDENTI,
   BAN_NOMBRE
FROM
   BANCOS

puedes ver si usa algún índice o no haciendo click en la pestaña “Performance Analysis”, como se muestra a continuación:

VISTAS1Captura 1. Si haces clic en la imagen la verás más grande

Lo que veremos en este caso será lo siguiente:

VISTAS2Captura 2. Si haces clic en la imagen la verás más grande

Y nos muestra gráficamente que no se está usando un índice.

“Non-indexed reads” significa: “lecturas que no usan un índice”

“Indexed reads” significa: “lecturas que usan un índice”

Esta tabla es muy pequeña, solamente tiene 16 filas así que usar un índice o no será casi lo mismo, pero en tablas grandes que tienen miles o millones de filas la diferencia en el tiempo empleado puede ser grandísima, monstruosa.

¿Cómo se puede cambiar la vista anterior para que utilice un índice?

Agregándole la cláusula WHERE o la cláusula ORDER BY, por ejemplo:

CREATE VIEW V_ABM_BANCOS(
   BAN_CODSUC,
   BAN_IDENTI,
   BAN_NOMBRE)
AS
SELECT
   BAN_CODSUC,
   BAN_IDENTI,
   BAN_NOMBRE
FROM
   BANCOS
WHERE
   BAN_CODSUC >= 0

Si ahora hacemos click en “Performance Analysis” lo que veremos será esto:

VISTAS3

Captura 3. Si haces clic en la imagen la verás más grande

o sea que nuestra vista ahora sí está usando un índice.

Aquí hay otro ejemplo de una vista que no está optimizada:

VISTAS4

Captura 4. Si haces clic en la imagen la verás más grande

Como puedes ver las lecturas a la tabla SUCURSALES no usan un índice. En la casi totalidad de los casos eso es un error, lo correcto es que sí usen un índice.

Conclusión:

Siempre debemos verificar que nuestras consultas (o sea los SELECT) y nuestras vistas estén optimizadas porque si están optimizadas devolverán los resultados mucho más rápidamente. Para que estén optimizadas deben (prácticamente siempre) utilizar un índice en cada tabla. El programa EMS SQL Manager nos puede mostrar gráficamente si una consulta o una vista usa un índice en cada tabla o no lo hace.

Para obligarle al Firebird a utilizar un índice debemos escribir las columnas de ese índice en las cláusulas WHERE, JOIN, UNION u ORDER BY.

Si el índice que utiliza el Firebird no nos parece el más adecuado podemos indicarle cual índice utilizar con la cláusula PLAN. Más información sobre la cláusula PLAN puedes encontrar en:

https://firebird21.wordpress.com/2013/04/30/usando-un-plan/

Artículos relacionados:

Usando un PLAN

El índice del blog Firebird21

El foro del blog Firebird21

Anuncios