Как ускорить обработку запросов к системным таблицам?

При работе с объектами БД всегда выполняются некие запросы к системным таблицам. Это, например, происходит при открытии TTable – вы можете сами убедиться в этом, посмотрев в момент открытия в SQL Monitor. Если объектов в базе данных много, то некоторые подобные запросы начинают выполнятьс очень медленно, т. к. происходит полное сканирование некоторых системных таблиц. Производительность вашей БД можно ускорить (на некоторых операциях до 10 раз) добавив индексы по некоторым полям системных таблиц. Попробуйте сами, применив нижеприведенный скрипт.
Замечание от 01.10.2018. Эта статья была написана более 10 лет назад. С тех пор в СУБД Firebird был добавлен ряд индексов на системные таблицы. Примечания по этим индексам сделаны красным цветом.
 
Примечание. Фраза "CREATE INDEX" вообще отсутствует в стандарте ISO/ANSI SQL92, поскольку индексы нужны только для повышения производительности, а в стандарте нет ничего, имеющего отношение к производительности.
/* Добавление индексов на системные таблицы для увеличени производительности. */
CONNECT "MYSERVER:C:/MYDIR/TEST.GDB" USER "SYSDBA" PASSWORD "masterkey";

CREATE INDEX RDB$D_DON ON RDB$DEPENDENCIES (RDB$DEPENDED_ON_NAME);
-- этот индекс уже есть
CREATE INDEX RDB$D_DN ON RDB$DEPENDENCIES (RDB$DEPENDENT_NAME);
-- этот индекс тоже есть
CREATE INDEX RDB$D_DNON ON RDB$DEPENDENCIES (RDB$DEPENDENT_NAME, RDB$DEPENDED_ON_NAME);
-- совсем не нужен, т.к. есть два отдельных индекса по этим столбцам

CREATE INDEX RDB$LF_FS ON RDB$LOG_FILES (RDB$FILE_SEQUENCE);
-- даже в Firebird 1.5 таблица RDB$LOG_FILES помечена как устаревшая и не используемая

CREATE INDEX RDB$TR_ID ON RDB$TRANSACTIONS (RDB$TRANSACTION_ID);
-- уже есть, и в таблице RDB$TRANSACTIONS хранятся транзакции двухфазного коммита, которые используются крайне редко

CREATE INDEX RDB$TM_TN ON RDB$TRIGGER_MESSAGES (RDB$TRIGGER_NAME);
-- уже есть

CREATE INDEX RDB$T_FN ON RDB$TYPES (RDB$FIELD_NAME);
-- в этой таблице на текущий момент не более 254 записи, индекс практически не имеет смысла

CREATE INDEX RDB$UP_G ON RDB$USER_PRIVILEGES (RDB$GRANTOR);
-- может иметь смысл только если в этой таблице большое количество записей
CREATE INDEX RDB$UP_U ON RDB$USER_PRIVILEGES (RDB$USER);
-- такой индекс уже есть
CREATE INDEX RDB$UP_UG ON RDB$USER_PRIVILEGES (RDB$USER, RDB$GRANTOR);
- не нужен, если уже создали индекс по RDB$GRANTOR

CREATE INDEX RDB$VR_VN ON RDB$VIEW_RELATIONS (RDB$VIEW_NAME);
-- такой индекс уже есть
 
(с) 1997 Epsylon Technologies

Подпишитесь на новости Firebird в России

Подписаться