
Como todos sabemos, la base de datos de IBM i llamada DB2 for i tiene capacidades únicas. Nos permite correr programas antiguos contra objetos de base de datos que pueden tener varios miembros usando Record Level Access, así como acceder a la información mediante comandos SQL.
Originalmente los índices se creaban usando DDS, pero desde hace ya unos años podemos crearlos con DDL. Siempre hay quien pregunta si es uno mejor que el otro, y obviamente la respuesta es "depende".
Si vamos a usar RLA obviamente necesitaremos índices basados en lógicos mediante la compilación de DDS. Si nuestra operación se basa en SQL lo ideal siempre ha sido usar índices creados mediante DDL.
El motor de base de datos contaba con CQE o Classic Query Enginne, que permitía crear índices para uno y otro caso. A partir de la introducción del SQE o SQL Query Enginne los índices creados con DDS se pueden usar, cuando las condiciones lo permitan, en instrucciones SQL. Obviamente existen factores de optimización que podrían indicar la conveniencia de usar índices con DDL, debido a lo compacto de estos.
Sin embargo, el punto más importante es que existan índices para satisfacer las necesidades de las aplicaciones que corren en los equipos. He visto casos donde la diferencia entre usar un índice o no es de 36 hs vs 0:01:30 hs (1 minuto y medio).
Debemos recordar que los motores de bases de datos emplean algoritmos para decidir que índices usarán, y DB2 for i no es la excepción. Algunas bases de datos emplean optimización basada en costo, otras basado en reglas.
Optimización basada en reglas: Existen una serie de reglas y patrones que permiten que el optimizador decida cómo ejecutará el query y que índices usará. Esto puede no siempre ser lo más conveniente desde el punto de vista del rendimiento.
Optimización basada en costo: Se basa en el esfuerzo que deberá hacer la base de datos para obtener la información, usando las estadísticas como base para la evaluación. Es el método que emplea DB2 for i
Al basar la optimización en algoritmos basados en costo la base de datos no siempre empleará los índices que esperamos que use, sino los que dicten las estadísticas. Esto puede provocar que el equipo necesite índices adicionales.
Afortunadamente DB2 for i nos provee de una herramienta para determinar que índices nos está recomendando el optimizador.
Existen 2 vistas que nos pueden auxiliar a determinar las tables e índices que necesitamos: QSYS2.SYSIXADV y QSYS2.CONDENSEDINDEXADVICE
Esta última hace un resumen de los índices que necesitamos, evitando índices que están contenidos en otros.
Dentro de ambas vistas podemos ver el tipo de índice que nos recomiendan, la cantidad de veces que fué recomendado, la estructura del índice, si se han creado índices temporales con dicha estructura, el tamaño de la tabla a indexar, etc. Con esta información podremos hacer un filtrado de los índices más significativos, o podemos buscar los que correspondan a las tablas que realmente nos interesan.
Si queremos hacer todo más sencillo podemos usar el IBM Systems Director Navigator for i:
Vamos a "Bases de Datos"->Schemas-><NOMBRE-DE-BIBLIOTECA> y presionamos botón derecho, donde seleccionaremos "Asesor de índices"
Si seleccionamos uno de estos índices recomendados y hacemos click derecho podremos crear el índice de inmediato, sólo debemos darle un nombre.
En el menú de Index Advisor/Asesor de Indices también podremos borrar las estadísticas para que se vuelvan a generar.