Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Целесообразность создания композитных индексов
|
|||
|---|---|---|---|
|
#18+
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 лет. К слову сказать, оптимизатор ФБ всегда для таких запросов верный план подбирает (конкретно для этого случая проблем не было ни разу). И еще, напоследок. Тебе тут советовали факи многие уважаемые люди. Прочти их. Хоть раз в жизни придется прочитать для понимания, как это работает. Как вообще индексы работают. Как используют битовую маску ключа, как сортируются и вообще, теорию почитай. Для общего понимания, зачем это надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2015, 15:26 |
|
||
|
Целесообразность создания композитных индексов
|
|||
|---|---|---|---|
|
#18+
YuRockесть индексы с ключем (TERMINAL_ID,SHIFT_ID). Терминалов больше ста, смен в каждом терминале несколько тысячпочему порядок полей в индексе именно такой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2015, 15:32 |
|
||
|
Целесообразность создания композитных индексов
|
|||
|---|---|---|---|
|
#18+
fd00ch, Как зачем. Чтобы по всему терминалу за всю историю суммы считать. Чтобы за период смен суммы считать... А что? Смены, кстати, с единицы в каждом терминале идут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2015, 23:33 |
|
||
|
Целесообразность создания композитных индексов
|
|||
|---|---|---|---|
|
#18+
YuRock, Спасибо за объяснение. С методами доступа к данным в FB я знаком в целом. В твоем ответе не рассмотрен случай, когда индексы созданы отдельно для полей f1, f2. Разница между индексами f1 и (f1, f2) очевидна. Если у нас есть индексы отдельные на f1 и f2, для запроса f1=:x and f2=:y оптимизатор сначала будет использовать лучший индекс из этих двух, а после отбора по полю лучшего индекса применит оставшийся индекс, так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2015, 10:54 |
|
||
|
Целесообразность создания композитных индексов
|
|||
|---|---|---|---|
|
#18+
Interloper, нет не так. Перечитай статью ещё раз. Можно ещё трёшку поставить и посмотреть что там explain план говорит. Очень полезно для понимания что и как работает. Вот маленький пример Код: sql 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. 6. 7. из плана видно, что по каждому из индексов создаются битовые маски, а потом они объединяются и лишь только потом идёт выборка из таблицы по внутреннему идентификатору RDB$DB_KEY Теперь посмотрим что будет когда индекс создан по двум полям Код: sql 1. Код: sql 1. 2. 3. Код: plaintext 1. 2. 3. 4. Из плана видно, что битовая маска строится один раз, а потом сразу идёт выборка из таблицы по внутреннему идентификатору RDB$DB_KEY Что немного дешевле. Скоко это будет в цифрах хз. Надо мерить в каждом конкретном случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2015, 11:50 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38912297&tid=1562958]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
163ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 255ms |

| 0 / 0 |
