Здесь произошло либо то, что СУБД не может использовать индекс для предиката LEFT () и может использовать его в LIKE, либо она просто сделала неправильный вызов, в котором был бы более подходящий метод доступа .
Во-первых, для некоторых РСУБД может быть справедливо, что применение функции к столбцу не позволяет использовать метод доступа на основе индекса, но это не универсальная истина, и при этом нет логической причины, почему это необходимо. Метод доступа на основе индекса (такой как полное сканирование индекса Oracle или быстрое полное сканирование индекса) может быть полезным, но в некоторых случаях СУБД не может работать в контексте предиката на основе функции.
Во-вторых, оптимизатор может просто неправильно понять арифметику при оценке преимуществ различных доступных методов доступа. Предполагая, что система может выполнить метод доступа на основе индекса, она сначала должна сделать оценку числа строк, которые будут соответствовать предикату, либо из статистики в таблице, статистики по столбцу, путем выборки данных во время анализа, или использовать эвристическое правило (например, «предположим, 5% строк будут совпадать»). Затем он должен оценить относительную стоимость полного сканирования таблицы или доступных методов на основе индекса. Иногда это может привести к неправильной арифметике, иногда статистика будет вводить в заблуждение или неточна, а иногда эвристические правила не будут подходить для набора данных.
Ключевым моментом является знание ряда проблем:
- Какие операции может поддерживать ваша СУБД?
- Что будет наиболее подходящей операцией в
Если вы работаете с?
- Правильный ли выбор системы?
- Что можно сделать, чтобы позволить системе выполнять более эффективную операцию (например, добавить отсутствующее ненулевое ограничение, обновить статистику и т. Д.)?
По моему опыту, это не тривиальная задача, и часто ее лучше оставлять экспертам. Или, с другой стороны, просто опубликуйте проблему в Stackoverflow - некоторые из нас находят это увлекательным, собака помогает нам.