Страница 1 из 1

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

Добавлено: 10 фев 2006, 13:21
natalika
Работаю на 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, но и вручную "планировать" запрос не хочется)

Добавлено: 10 фев 2006, 13:33
kdv

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

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

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

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

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