En este artículo habíamos visto como recalcular las estadísticas de todos los índices de todas las tablas:

Selectividad de los índices

Y en este otro artículo habíamos visto como podemos reindexar todos los índices de todas las tablas:

Recreando todos los índices de todas las tablas

en el presente artículo combinaremos ambos stored procedures en uno solo porque de esa manera nos resultará más fácil el mantenimiento de los índices.

SET TERM ^ ;

CREATE PROCEDURE SP_MANTENIMIENTO_INDICES
RETURNS(
   tcNombreTabla  VARCHAR(31),
   tcNombreIndice VARCHAR(31),
   tcRestriccion  VARCHAR(11),
   tcReindex      VARCHAR( 2),
   tcStatistics   VARCHAR( 2))
AS
BEGIN

   FOR SELECT
      RDB$RELATION_NAME,
      RDB$INDEX_NAME
   FROM
      RDB$INDICES
   ORDER BY
      RDB$RELATION_NAME
   INTO
      :tcNombreTabla,
      :tcNombreIndice
   DO BEGIN
      tcReindex     = '';
      tcStatistics  = '';
      tcRestriccion = (SELECT RDB$CONSTRAINT_TYPE FROM RDB$RELATION_CONSTRAINTS WHERE RDB$INDEX_NAME = :tcNombreIndice);
      tcRestriccion = IIF(tcRestriccion IS NULL, '', tcRestriccion);
      IF (NOT EXISTS(SELECT RDB$INDEX_NAME FROM RDB$RELATION_CONSTRAINTS WHERE RDB$INDEX_NAME = :tcNombreIndice) AND LEFT(tcNombreIndice, 4) <> 'RDB$') THEN BEGIN
         EXECUTE STATEMENT 'ALTER INDEX ' || :tcNombreIndice || ' INACTIVE ;' ;
         EXECUTE STATEMENT 'ALTER INDEX ' || :tcNombreIndice || ' ACTIVE ;' ;
         tcReindex = 'SI';
      END
      EXECUTE STATEMENT 'SET STATISTICS INDEX ' || :tcNombreIndice || ';' ;
      tcStatistics = 'SI';
      IF (LEFT(tcNombreIndice, 4) <> 'RDB$') THEN
         SUSPEND;
   END

END^

En este stored procedure solamente recreamos los índices nuestros y que además no estén relacionados con una restricción pero recalculamos las estadísticas de todos los índices (los internos del Firebird y los de las restricciones también). Como normalmente no nos interesa mostrar los índices internos del Firebird sino solamente los nuestros entonces al SUSPEND lo colocamos dentro de un IF.

A este stored procedure lo llamaríamos así:

SELECT * FROM SP_MANTENIMIENTO_INDICES

Y aquí está una captura de lo que obtendremos al ejecutar este SELECT:

MANTENIMIENTO1

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

Como puedes ver, allí están el nombre de la tabla, el nombre del índice, la restricción, si fue reindexado o no, y si se recalcularon sus estadísticas. Este SELECT puede resultarte muy útil para usarlo en un programa que le muestre al usuario el mantenimiento de los índices.

Artículos relacionados:

Usando índices en Firebird

Selectividad de los índices

Recreando todos los índices de todas las tablas

El índice del blog Firebird21

Anuncios