En este artículo habíamos visto como recalcular las estadísticas de todos los índices de todas las tablas:
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:
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:
El índice del blog Firebird21 | Firebird SQL
Ago 24, 2013 @ 19:33:28
Ago 26, 2013 @ 13:58:27
Walter , gracias por el aporte.
Me marca un error al querer guardar el SP.
“Precompiler Error: Syntax error –
.”
Que será ?
Ago 26, 2013 @ 14:17:57
De nada.
Si estás usando el EMS SQL Manager haz doble clic sobre ese mensaje de error para que ilumine la línea donde se encuentra. Luego borra la línea que está iluminada (es decir, la que tiene el error) y vuelve a copiar su contenido anterior, con eso se debería solucionar.
Saludos.
Walter.
Ago 28, 2013 @ 20:40:23
Corregido, era el ultimo END, yo lo quitaba porque quitaba tambien el SET TERM
Ultima pregunta, para hacer este proceso, no importa si hay usuarios conectados ?
Gracias.
Ago 28, 2013 @ 21:30:37
No, no debería importar que haya usuarios conectados.
Saludos.
Walter.
Sep 24, 2013 @ 19:11:47
Walter excelente tu blog, una pregunta me sale un error o mejor se que no existe un indice, la pregunta es como localizo el indice que hace falta, tambien ya utilize el .bat de mantenimiento de archivos y paso sin problemas. Gracias por tu ayuda.
Sep 24, 2013 @ 19:19:58
Muchas gracias Mauricio.
Para conocer los nombres de todos los índices que estás usando puedes escribir el siguiente SELECT:
SELECT
RDB$RELATION_NAME,
RDB$INDEX_NAME
FROM
RDB$INDICES
ORDER BY
RDB$RELATION_NAME
¿Era esa tu pregunta? no estoy seguro de si era lo que me preguntaste. Si no era, trata de explicarme mejor lo que estás necesitando.
Saludos.
Walter.