Для оптимизации запроса не тот индекс выбирается

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

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

Ответить
natalika
Сообщения: 2
Зарегистрирован: 10 фев 2006, 13:14

Для оптимизации запроса не тот индекс выбирается

Сообщение natalika » 10 фев 2006, 13:21

Работаю на FB 1.0, 1.5
Простенький такой запрос
select * from Main where DateDoc="01.01.2006" and Status>=1
использует для оптимизации в первую очередь индекс по полю Status. А в таблице менее 1% записей где Status=0 - именно для их быстрой выборки был создан индекс на Status. В написанном тексте если указать PLAN (MAIN INDEX (M_DATEDOC)) запрос выполняется в сотню раз быстрее. А есть возможность с точностью наоборот - указать перечень индексов, не используемых для плана в запросе (для более сложных запросов где для оптимизации мне не нужен индекс M_Status, но и вручную "планировать" запрос не хочется)

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

Сообщение kdv » 10 фев 2006, 13:33

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

select * from Main where DateDoc="01.01.2006" and Status+0>=1

natalika
Сообщения: 2
Зарегистрирован: 10 фев 2006, 13:14

Сообщение natalika » 10 фев 2006, 13:41

Ну да, хороший выход для поставленной задачи - не использовать индекс.
от вычислений запрос думаю замедлится. Тут базы немаленькие, многомиллионные таблицы. Когда выборка за один день - там все равно есть вычисления с полем статус, нет. А если несколько миллионов в выборке? Чую - не слишком хороший выход. Хотелось бы универсальное решение вне зависимости от выбранного периода.

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

Сообщение kdv » 10 фев 2006, 13:51

от вычислений запрос думаю замедлится.
на сколько, на пару тысячных секунды?
немаленькие, многомиллионные таблицы
ну и что...
Чую - не слишком хороший выход. Хотелось бы универсальное решение вне зависимости от выбранного периода.
очень хороший выход. А при чем тут "период"? Период или нет, в запросе есть условие по полю STATUS. Если подавляющее большинство запросов обращается к этому статусу именно с проверкой на >=1, и как раз таких записей много, то лучше такой индекс вообще удалить.

А миллион вычислений + 0 доли секунды займет.

Ответить