Dmitri Kuzmenko wrote:

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

на основании чего сделан вывод, что оптимизатор "должен принимать решение в процессе"? На этапе prepare известна кардинальность
таблиц и селективность индексов, и во время выполнения она не
меняется, да и скорректировать эти измерения никак.

Селективность - это средняя температура по больнице. Неизвестно сколько попадёт в выборку в действительности с конкретными параметрами.
Плюс селективность для условий типа > или < оценивается очень грубо.

Ведь в принципе нетрудно одновременно с построением битовой маски посчитать количество записей, которые попало в неё.

блин. это не количество записей. Это потенциальное количество
записей без учета версий. Даже если запись попала в битмап,
она может быть удалена. Или, у одной записи могут быть тыщи
версий, из которых или все или ни одной видны конкретной
транзакции, выполняющей запрос.
Видимость версий определяется только в момент чтения версий.

Я в курсе про версии. Это несущественно, т.к. версионность может только уменьшить размер выборки, но никак не увеличить. Если в битовой маске например 10 записей оказалось, то полюбому их будет меньше или равно 10.

p.s. я фигею, дорогая редакция. у нас (в ФБ) основная
"бяка" с оптимизатором в том, что
а) в ключах нет информации о видимости ключей (нет номеров транзакций)
б) видимость версий определяется только при чтении

Я считаю, что это не бяка. Всё правильно сделано. Так и должно быть.


Ответить