Hello, Alexey!
Alexey Popov wrote:
Это тоже понятно. Вопрос в том, как это сочетается с ранее вычисленной
битовой маской. Т.е. примерно так что ли
1) едем последовательно по индексу для order by и берём номера записей.
2) по номеру записи лезем в битовую маску и проверяем условие.
Что то я сомневаясь в такой схеме - получается полный проход по индексу,
даже если в битовой маске всего одна запись.
ну а как? ты же просил в порядке индекса. Допустим, там не одна запись,
а две. Или три. Их же надо выдать ORDER BY A. Какая разница, отобралось
что по еще одному критерию, или нет?
Тут на самом деле все очень просто, если иметь упомянутые
мной в прошлый раз "азы" :-)
Допустим, есть битовая маска. Но там ни какого "порядка" нет,
только отмеченные по физ. номерам записи.
И есть индекс. Индекс это ключ + номер записи. Причем все это
"отсортировано" по ключу. Т.е. невозможно сказать, какой номер
записи будет идти по какому ключу.
Ты вот все время напираешь, что "а если одна запись".
Я уже говорил, что действительно, оптимизатор теоретически
должен бы при определенной селективности столбца B
в
select * from table
where b = 5
order by a
игнорировать индекс по A.
Но пока, вроде, не игнорирует. Другое дело, что
при проходе по индексу A он не лезет проверять записи на b=5,
а проверяет ту самую битовую маску по B сразу же. И только если
совпало, выдает запись "на выход". Так что IO все же экономится.
--
Dmitri Kouzmenko, www.ibase.ru, (495) 953-13-34