Запросы, планы, оптимизация запросов, ...
Модераторы: 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 доли секунды займет.