Здесь показаны различия между двумя версиями данной страницы.
indices_maintenance [2009/07/01 16:11] |
indices_maintenance [2009/07/01 16:11] (текущий) |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== Обслуживание индексов ====== | ||
+ | |||
+ | ===== Описание ===== | ||
+ | Несколько полезных хранимых процедур для обслуживания индексов БД. | ||
+ | |||
+ | <code sql> | ||
+ | |||
+ | /******************************************************************************/ | ||
+ | /* Автор Е.Виноградный (ssdi) */ | ||
+ | /******************************************************************************/ | ||
+ | /**** Процедуры для обслуживания индексов БД ****/ | ||
+ | /******************************************************************************/ | ||
+ | |||
+ | SET TERM ^ ; | ||
+ | |||
+ | -- Расчитывает селективность всех индексов | ||
+ | CREATE OR ALTER PROCEDURE INDICES_REBUILD_SELECTIVITY | ||
+ | AS | ||
+ | DECLARE VARIABLE S VARCHAR(200); | ||
+ | BEGIN | ||
+ | /*Процедура для перерасчета селективности индексов, запускать переодически (если не было ресторинга БД), | ||
+ | либо в случае больших изменений в БД.*/ | ||
+ | FOR SELECT RDB$INDEX_NAME FROM RDB$INDICES INTO :S DO | ||
+ | BEGIN | ||
+ | S = 'SET statistics INDEX ' || S || ';'; | ||
+ | EXECUTE STATEMENT :S; | ||
+ | END | ||
+ | SUSPEND; | ||
+ | END^ | ||
+ | |||
+ | -- Включает/выключает индексы в БД | ||
+ | CREATE OR ALTER PROCEDURE INDICES_SWITCH ( | ||
+ | ENABLE_FLAG INTEGER) | ||
+ | AS | ||
+ | DECLARE VARIABLE RELATION_NAME VARCHAR(256); | ||
+ | DECLARE VARIABLE INDEX_INACTIVE INTEGER; | ||
+ | DECLARE VARIABLE ACTION_NAME VARCHAR(50); | ||
+ | DECLARE VARIABLE SQL VARCHAR(256); | ||
+ | BEGIN | ||
+ | /* Переключает состояние индексов */ | ||
+ | /* source SQL | ||
+ | SELECT R.RDB$CONSTRAINT_NAME, R.RDB$INDEX_NAME AS REFINDEXNAME, I.RDB$INDEX_NAME AS REALINDEX, I.RDB$RELATION_NAME, I.RDB$INDEX_INACTIVE | ||
+ | FROM RDB$INDICES I RIGHT JOIN RDB$RELATION_CONSTRAINTS R ON I.RDB$INDEX_NAME = R.RDB$INDEX_NAME | ||
+ | WHERE R.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY' OR R.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY' | ||
+ | ORDER BY R.RDB$CONSTRAINT_NAME | ||
+ | */ | ||
+ | --Все активные переводим в неактивные (default) | ||
+ | INDEX_INACTIVE = 0; | ||
+ | ACTION_NAME = 'INACTIVE'; | ||
+ | IF (ENABLE_FLAG > 0) THEN | ||
+ | BEGIN | ||
+ | --Перевод в активное состояние | ||
+ | INDEX_INACTIVE = 3; | ||
+ | ACTION_NAME = 'ACTIVE'; | ||
+ | END | ||
+ | |||
+ | FOR SELECT I.RDB$INDEX_NAME | ||
+ | FROM RDB$INDICES I | ||
+ | RIGHT JOIN RDB$RELATION_CONSTRAINTS R ON I.RDB$INDEX_NAME = R.RDB$INDEX_NAME | ||
+ | WHERE (R.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY' OR R.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY') | ||
+ | AND (I.RDB$INDEX_INACTIVE = :INDEX_INACTIVE) | ||
+ | INTO :RELATION_NAME DO | ||
+ | BEGIN | ||
+ | SQL = 'ALTER INDEX ' || RELATION_NAME || ' ' || ACTION_NAME; | ||
+ | IF (SQL IS NOT NULL) THEN EXECUTE STATEMENT SQL; | ||
+ | END | ||
+ | END^ | ||
+ | |||
+ | -- Переактивация индексов через выключение-включение | ||
+ | CREATE OR ALTER PROCEDURE INDICES_REACTIVATE | ||
+ | AS | ||
+ | BEGIN | ||
+ | EXECUTE PROCEDURE INDICES_SWITCH(0); | ||
+ | EXECUTE PROCEDURE INDICES_SWITCH(1); | ||
+ | END^ | ||
+ | |||
+ | SET TERM ; ^ | ||
+ | |||
+ | </code> | ||
+ | |||
+ | ===== См. также ===== | ||
+ | [[http://groups.google.com/group/ru-firebird/browse_thread/thread/abaccbcbef25491?hl=ru | | ||
+ | активация всех индексов]]. Конференция по Firebird и Interbase. | ||