Dmitri Kuzmenko wrote:

Ты вот все время напираешь, что "а если одна запись".
Я уже говорил, что действительно, оптимизатор теоретически
должен бы при определенной селективности столбца B
в
select * from table
where b = 5
order by a
игнорировать индекс по A.

Но пока, вроде, не игнорирует. Другое дело, что
при проходе по индексу A он не лезет проверять записи на b=5,
а проверяет ту самую битовую маску по B сразу же. И только если
совпало, выдает запись "на выход". Так что IO все же экономится.

Это понятно. У меня вызывает вопросы выбор между планами
PLAN (EVENTS ORDER IDX_A INDEX (IDX_A, IDX_B))
и
PLAN SORT (EVENTS INDEX (IDX_A, IDX_B))

Записей в таблице может быть очень много. Соответственно индекс большой тоже по размеру. Если битовая маска INDEX (IDX_A, IDX_B) даёт мало записей, то SORT очевидно будет предпочтительнее. В этой ситуации оптимизатор должен принимать решение уже в процессе выполнения запроса, а не в момент prepare. Ведь в принципе нетрудно одновременно с построением битовой маски посчитать количество записей, которые попало в неё.
Но раз этого нет, то мне надо план как то захардкодить уже сейчас.


Ответить