Здесь задействовано несколько факторов:
Во-первых, этот запрос использует вторую (или третью) часть составного индекса, в результате чего SKIP SCAN
.
посмотрите на все индексы в таблице и посмотрите, что это за индекс TIPORECIBO
. Вполне вероятно, что это не ведущая колонка. Вы можете улучшить производительность, создав индекс с TIPORECIBO
в качестве ведущего столбца, но это маловероятно - это столбец типа, который может иметь только несколько значений и не является хорошим кандидатом для индекса.
Вторая проблема заключается в том, что Oracle использует индекс для получения набора строк-кандидатов, а затем переходит к самим блокам данных, чтобы получить строки для дальнейшей фильтрации. select count(*)
будет работать намного лучше, если Oracle не нужно извлекать блоки данных. Это может быть достигнуто путем создания индекса, который содержит все данные, необходимые для фильтра.
В вашем случае индекс для TIPORECIBO
и FECHAEMISION
будет означать, что Oracle может go до один индекс без необходимости доступа к блокам данных.
Третья проблема заключается в том, что вы применяете TO_DATE
к столбцу FECHAEMISION
. Если это тип данных DATE
, то вам не нужно преобразование, и это вызывает у вас проблемы. Если вам нужно преобразование, опцией будет индекс на основе функций для TO_DATE(D.FECHAEMISION, 'yyyy/MM/dd')
.
Чтобы настроить этот конкретный запрос, вы можете попробовать составной индекс на основе функций:
CREATE INDEX TB_E2V_DOCUMENTOS_CICLO_FX1 ON TB_E2V_DOCUMENTOS_CICLO(FECHAEMISION, TO_DATE(D.FECHAEMISION, 'yyyy/MM/dd'))
Наконец, этот запрос явно генерируется из кода: такие строки, как AND (D.BA = null or null is null)
, по-видимому, являются способом исключения частей предложения WHERE
, когда внешний интерфейс проходит NULL
. Возможно, это будет AND (D.BA = 'X' or 'X' is null)
, если для этого параметра будет указано значение.
Поэтому будьте осторожны при настройке текущего набора параметров, поскольку любое изменение в том, что сгенерировало этот запрос, повлияет на эффективность вашего запроса. tuning.
Если у вас есть способ повлиять на то, как генерируется этот запрос, было бы неплохо просто исключить эти фильтры не-событий, когда значения не предоставлены, хотя Oracle должен иметь возможность обрабатывать они как есть.