Работа с индексами в INTERBASE FireBird
Индексы - важный объект базы данных. Как Вы уже видели, они используются для построения ограничений типа PRIMARY KEY, FOREIGN KEY и UNIQUE. Но, кроме этих важных индексов, создаваемых SQL сервером автоматически, в базе данных присутствуют и индексы, созданные пользователем. Они употребляются для улучшения доступа к данным, обеспечения сортировок.
Несколькими примерами (далеко не исчерпывающими все возможности) я хочу показать, какую информацию можно почерпнуть из служебных таблиц базы данных касаемо индексов.
select RDB$INDEX_NAME
from rdb$indices
where rdb$relation_name = "CUSTOMER";
Это выражение вернет Вам список всех индексов, принадлежащих указанной таблице (CUSTOMER). Но в результате будут содержаться все индексы, а не только созданные пользователем. Попробуем выделить только созданные пользователем индексы.
select RDB$INDEX_NAME
from rdb$indices
where (rdb$relation_name = "CUSTOMER")
AND NOT (RDB$INDEX_NAME STARTING WITH "RDB$");
Индексы обладают и другими свойствами, а не только именем. Попробуем узнать некоторые из них.
select RDB$INDEX_NAME, RDB$UNIQUE_FLAG, RDB$INDEX_INACTIVE, RDB$STATISTICS
from rdb$indices
where (rdb$relation_name = "CUSTOMER")
AND NOT (RDB$INDEX_NAME STARTING WITH "RDB$");
Поле RDB$UNIQUE_FLAG определяет, позволяет ли индекс двойные значения. Если это поле имеет значение 1, то двойных значений быть не может. RDB$INDEX_INACTIVE показывает, работает ли индекс в данный момент, т.е. активен ли он. Когда в этом поле стоит значение 0, то индекс активен. RDB$STATISTICS - коэффициент избирательности, используется оптимизатором для выбора стратегии доступа при выполнении запроса.
Всем известно, что индексы строятся по одному или нескольким полям таблицы. Приведем пример того, как можно узнать, на базе каких полей построен индекс. Информация о полях, входящих в индекс содержится в таблице RDB$INDEX_SEGMENTS.
select RDB$FIELD_NAME, RDB$FIELD_POSITION
from rdb$index_segments where rdb$index_name = "CUSTREGION"
order by rdb$field_position;
Этот запрос вернет нам список полей, по которым построен индекс, а также порядок полей в индексе.
В том случае, если Вы много работаете с таблицами, вносите большое количество изменений, то может произойти разбалансировка индекса, что приведет к увеличению времени выполнения запросов и, соответственно, производительности в целом. Этого можно избежать, проводя перестройку индексов. Для этого нужно, сначала деактивировав индексы, а потом активировать их.
SELECT 'alter index '|| RDB$INDEX_NAME ||' INACTIVE;'
FROM RDB$INDICES
WHERE NOT (RDB$INDEX_NAME STARTING WITH "RDB$");
Этот SQL-запрос даст Вам набор строк-команд для деактивации индексов. Поочередно выбирая получившиеся строки в программе, можно использовать их как команды для деактивизации соответствующего индекса. Если этот запрос выполнить в Windows ISQL, то из области результата можно будет скопировать скрипт, выполняющий те же действия. Следующий запрос дает набор команд для обратной процедуры.
SELECT 'alter index '|| RDB$INDEX_NAME ||' ACTIVE;'
FROM RDB$INDICES
WHERE NOT (RDB$INDEX_NAME STARTING WITH "RDB$");
Деактивизация индексов полезна и тогда, когда нужно добавить большое количество записей.
Индекс имеет такой показатель, как "полезность", который используется InterBase-сервером для выбора оптимального плана удовлетворения запросов. Его рекомендуется пересчитывать. Для получения скрипта, делающего это для всех индексов, можно попробовать следующий запрос.
SELECT 'SET STATISTICS INDEX '|| RDB$INDEX_NAME ||';'
FROM RDB$INDICES
WHERE NOT (RDB$INDEX_NAME STARTING WITH "RDB$");