Отключение индекса при добавлении в order поля без индекса

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
kda
Сообщения: 4
Зарегистрирован: 24 фев 2011, 17:50

Отключение индекса при добавлении в order поля без индекса

Сообщение kda » 27 июн 2012, 22:37

Имеется таблица с индексом по полю A.

При выполнении запроса

Код: Выделить всё

select * from table order by A
индекс этого поля используется.

Почему при добавлении в order by поля без индекса, например B

Код: Выделить всё

select * from table order by A, B
индекс по полю A перестает использоваться, возникает NATURAL?

Используется FB 2.5.1 SS

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Отключение индекса при добавлении в order поля без индек

Сообщение kdv » 28 июн 2012, 02:56

потому что для order by может быть использован только индекс, построенный по всем столбцам order by, и именно в том порядке, как они там указаны.
т.е. для order by a, b должен существовать индекс по a+b, а не отдельно по a, b, или по b+a.

почитайте что-нибудь по b-деревьям, как они устроены, например, книжку Тиори и Фрай. Тогда поймете, почему при order by a,b сервер не может использовать индекс только по a.

kda
Сообщения: 4
Зарегистрирован: 24 фев 2011, 17:50

Re: Отключение индекса при добавлении в order поля без индек

Сообщение kda » 28 июн 2012, 12:02

Спасибо за ответ!

Нет ли "хитрых" методов ускорить отклик сервера в описанном случае при большом кол-ве записей?

Проблема в том, что вместо поля B, может быть использовано поле C, D...
Создавать комбинации индексов на все случаи нет возможности.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Отключение индекса при добавлении в order поля без индек

Сообщение kdv » 28 июн 2012, 12:47

Нет ли "хитрых" методов ускорить отклик сервера в описанном случае при большом кол-ве записей?
почитайте
viewtopic.php?f=4&t=4175
в статье примеры с группировкой, но при группировке используется тот же метод доступа, что и при order by index. Производительность на идентичных данных будет одинаковой что при group by, что при order by.
Создавать комбинации индексов на все случаи нет возможности.
разумеется. но стремление делать order by по индексу на "большом количестве данных" как раз является противоречием. Потому что на большом количестве данных order by по индексу приведет к огромному количеству перечитываний страниц БД с диска, что замедлит работу.

Ответить