Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

Индексы.

Индексы - важный объект базы данных. Как Вы уже видели, они используются для построения ограничений типа 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$");

Назад | Содержание | Вперед

 

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...