Инструменты пользователя

Инструменты сайта


Боковая панель

Введение

Статьи и часто задаваемые вопросы

Установка и настройка

Обработка ошибок

Полезные запросы SQL

Тематические группы

indices_maintenance



Обслуживание индексов

Описание

Несколько полезных хранимых процедур для обслуживания индексов БД.

/******************************************************************************/
/*                Автор Е.Виноградный (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 ; ^

См. также

активация всех индексов. Конференция по Firebird и Interbase.

Обсуждение

Александр, 2012/05/23 09:41

Процедуры создаются из скрипта FB 2.5.1 x32, но не работает Переактивация индексов через выключение-включение http://ybex.com/d/nejr1p8yh7ltee2phd5uwwqazkb77clwq4cblfnn.html

Только авторизованные участники могут оставлять комментарии.
indices_maintenance.txt · Последние изменения: 2009/07/01 16:11 (внешнее изменение)