powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Целесообразность создания композитных индексов
6 сообщений из 31, страница 2 из 2
Целесообразность создания композитных индексов
    #38910012
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterloperМеня интересует мнение сообщества
При чем тут мнение сообщества. Тут важно конкретно твоё понимание.

Объясню на пальцах. При чем все это относится к любой базе, не только Firebird, включая допотопные и будущие. У тебя есть 3 варианта:

1. Таблица маленькая (какой нибудь короткий справочник в 5-10-20 записей). Тут индексы вообще не нужны никакие (ну кроме ПК для удобства использования уникальности записи). Быстрее записи перебрать чем подобрать индекс, поднять его в память и использовать.

2. Если в поле f1 одинаковые значения, то без индекса по двум полям (f1,f2) а только с индексом по f1 запрос с условием f1=:x and f2=:y будет равносилен (в лучшем случае) полному перебору всех записей без использования индекса. В этом случае индекс с двумя ключами (f1,f2) нужно делать обязательно (если, конечно, в f2 все значения не одинаковые, тогда просто условие делать не надо).
То же самое касается случаев, когда в f1 "много" одинаковых значений. Например, в таблице 500млн записей, а значения f1 1..100.

3. Если в поле f1 уникальные значения, то что с индексом (f1,f2), что с индексом (f1) у тебя запрос с условием f1=:x выдаст одну (максимум) запись. Соответственно, и f1=:x and f2=:y - тоже максимум одна запись. Следовательно, ключ f2 индекса будет только занимать место на диске, приводить к лишним чтениям и занимать лишнюю память. В таком случае индекс с ключами (f1,f2) бесполезен и даже вреден , надо делать только индекс (f1).
То же самое касается случаев, когда в f1 значения "почти" одинаковые. Например, дата/время, или еще что-то, что ты знаешь, в силу специфики твоей задачи. Т.е. если ты знаешь точно, что запрос с f1=:x будет выдавать единицы записей, то 2-й ключ делать не надо .

Какой случай у тебя - я хз.
У меня, например, много огромных таблиц, в которых есть индексы с ключем (TERMINAL_ID,SHIFT_ID). Терминалов больше ста, смен в каждом терминале несколько тысяч. И за каждую смену в зависимости от таблицы от одной записи до десятков тысяч записей. Иногда использую индексы даже с тремя ключами.
Все запросы TERMINAL_ID= AND SHIFT_ID= работают мгновенно уже более 10 лет. К слову сказать, оптимизатор ФБ всегда для таких запросов верный план подбирает (конкретно для этого случая проблем не было ни разу).

И еще, напоследок. Тебе тут советовали факи многие уважаемые люди. Прочти их. Хоть раз в жизни придется прочитать для понимания, как это работает. Как вообще индексы работают. Как используют битовую маску ключа, как сортируются и вообще, теорию почитай. Для общего понимания, зачем это надо.
...
Рейтинг: 0 / 0
Целесообразность создания композитных индексов
    #38910024
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockесть индексы с ключем (TERMINAL_ID,SHIFT_ID). Терминалов больше ста, смен в каждом терминале несколько тысячпочему порядок полей в индексе именно такой?
...
Рейтинг: 0 / 0
Целесообразность создания композитных индексов
    #38910506
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00ch,

Как зачем. Чтобы по всему терминалу за всю историю суммы считать. Чтобы за период смен суммы считать... А что? Смены, кстати, с единицы в каждом терминале идут.
...
Рейтинг: 0 / 0
Целесообразность создания композитных индексов
    #38912264
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

Спасибо за объяснение. С методами доступа к данным в FB я знаком в целом. В твоем ответе не рассмотрен случай, когда индексы созданы отдельно для полей f1, f2. Разница между индексами f1 и (f1, f2) очевидна. Если у нас есть индексы отдельные на f1 и f2, для запроса f1=:x and f2=:y оптимизатор сначала будет использовать лучший индекс из этих двух, а после отбора по полю лучшего индекса применит оставшийся индекс, так?
...
Рейтинг: 0 / 0
Целесообразность создания композитных индексов
    #38912296
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Interloper,

нет не так. Перечитай статью ещё раз.
Можно ещё трёшку поставить и посмотреть что там explain план говорит. Очень полезно для понимания что и как работает.

Вот маленький пример

Код: sql
1.
2.
3.
SELECT *
FROM FARM
WHERE CODE_COUNTRY = 1 AND CODE_OWNERSHIP = 5



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Select Expression
    -> Filter
        -> Table "FARM" Access By ID
            -> Bitmap And
                -> Bitmap
                    -> Index "FK_FARM_COUNTRY" Range Scan (full match)
                -> Bitmap
                    -> Index "FK_FARM_OWNERSHIP" Range Scan (full match)

из плана видно, что по каждому из индексов создаются битовые маски, а потом они объединяются и лишь только потом идёт выборка из таблицы по внутреннему идентификатору RDB$DB_KEY

Теперь посмотрим что будет когда индекс создан по двум полям

Код: sql
1.
CREATE INDEX REGISTRATION_IDX_HORSE_REGTYPE ON REGISTRATION (CODE_HORSE, CODE_REGTYPE);



Код: sql
1.
2.
3.
SELECT *
FROM REGISTRATION R
WHERE R.code_horse = 742363 AND r.code_regtype = 6



Код: plaintext
1.
2.
3.
4.
Select Expression
    -> Filter
        -> Table "REGISTRATION" as "R" Access By ID
            -> Bitmap
                -> Index "REGISTRATION_IDX_HORSE_REGTYPE" Range Scan (full match)

Из плана видно, что битовая маска строится один раз, а потом сразу идёт выборка из таблицы по внутреннему идентификатору RDB$DB_KEY

Что немного дешевле. Скоко это будет в цифрах хз. Надо мерить в каждом конкретном случае.
...
Рейтинг: 0 / 0
Целесообразность создания композитных индексов
    #38912297
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

теперь понятно, спасибо.
...
Рейтинг: 0 / 0
6 сообщений из 31, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Целесообразность создания композитных индексов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]