Hello, Alexey!
Alexey Popov wrote:
Это понятно. У меня вызывает вопросы выбор между планами
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.
на основании чего сделан вывод, что оптимизатор "должен принимать
решение в процессе"? На этапе prepare известна кардинальность
таблиц и селективность индексов, и во время выполнения она не
меняется, да и скорректировать эти измерения никак.
Ведь в принципе нетрудно одновременно с построением битовой маски
посчитать количество записей, которые попало в неё.
блин. это не количество записей. Это потенциальное количество
записей без учета версий. Даже если запись попала в битмап,
она может быть удалена. Или, у одной записи могут быть тыщи
версий, из которых или все или ни одной видны конкретной
транзакции, выполняющей запрос.
Видимость версий определяется только в момент чтения версий.
p.s. я фигею, дорогая редакция. у нас (в ФБ) основная
"бяка" с оптимизатором в том, что
а) в ключах нет информации о видимости ключей (нет номеров транзакций)
б) видимость версий определяется только при чтении
уже, как бы, плешь проели версионностью. И она не может не влиять
на оптимизатор.
Тупой пример - запрос с where field = 1, было 100к версий с
field = 1, но в очередной транзакции был update field = 2.
Стало записей (версий) = *2, ключей = *2, snapshot до update
видит одно, транзакция с update видит другое. 2x ключей указывают на
100к записей, где на самом деле 200к версий. Оптимизатору-то что
делать?
Решите проблему - вручим нобелевскую.
Собственно, про номера транзакций в ключах недавно был
здоровенный топик на sql.ru.
--
Dmitri Kouzmenko, www.ibase.ru, (495) 953-13-34