Хобрук: Ваш путь к мастерству в программировании

Oracle: супер-выбор из нескольких результатов удивительно медленный

Мне нужно было выполнить выборку в Oracle 11G, которая выглядела так:

select distinct p_date, column1, column2, ...
from table1 t1, table2 t2, ...
where (some join relations)
  and t1.p_date > to_date('010113','ddmmrr')

В какой-то момент я понял, что фильтр по p_date делал запрос очень медленным, в то время как тот же запрос без фильтра p_date был практически мгновенным. Кроме того, я понял, что запрос без фильтра возвращает небольшой набор результатов, около 30 строк, поэтому я подумал о переносе фильтра даты за пределы запроса.

Я пробовал эти два варианта:

with temp as (
select distinct p_date, column1, column2, ...
from table1 t1, table2 t2, ...
where (some join relations)
) select * from temp where p_date > to_date('010113','ddmmrr')

и

select * from (
select distinct p_date, column1, column2, ...
from table1 t1, table2 t2, ...
where (some join relations)
) where p_date > to_date('010113','ddmmrr')

ожидая, что он будет почти таким же быстрым, как внутренний запрос, поскольку он должен сначала выполнить его, а затем применить фильтр p_date только к 30 возвращенным строкам.

Однако в обоих случаях время выполнения было огромным (не могу сказать сколько, потому что у меня не хватило терпения дождаться результатов).

Может кто-нибудь сказать мне, почему это происходит?

В качестве примечания: таблица «table1» имеет индекс над p_date, который выглядит не так, как ожидалось (я также об этом позабочусь). Но может ли механизм Oracle определить это и ошибочно перестроить запрос во время выполнения, чтобы попытаться его использовать?

Заранее спасибо,

Карлес

06.06.2013

  • Пожалуйста, опубликуйте планы выполнения. 06.06.2013
  • Также опубликуйте точное соединение между таблицами, номер версии Oracle и определения таблиц. 06.06.2013
  • Оптимизатор Oracle может переписать запрос, если сочтет, что будет быстрее вставить предикат данных во вложенный выбор, да. Вам нужно будет отследить его, чтобы точно увидеть, что он делает, но планы выполнения должны показать вам, что он все еще использует индекс p_date (возможно, из того, что вы описали). Есть подсказки, которые помогут избежать этого, но вам нужно понять, почему это происходит, прежде чем пробовать их. 06.06.2013
  • это никогда не было почти мгновенным, хороший шанс, что когда вы запускали без фильтра, он извлекал большинство блоков из буферного кеша (из предыдущего запуска запроса). 06.06.2013

Ответы:


1
  1. "некоторые присоединяются к отношениям"? Какое-то описание...

  2. Вы используете отдельное ключевое слово, которое довольно активно использует TEMP.

  3. Если есть индекс над p_date, попробуйте использовать подсказку: /*+ INDEX */

    select /*+ INDEX (table_name index_name)*/ отдельные p_date, column1, column2, ...

    из таблицы1 t1, таблицы2 t2, ...

    где (некоторые отношения соединения)

    и t1.p_date > to_date('010113','ddmmrr')

06.06.2013
Новые материалы

Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

Фишинг — Упаковано и зашифровано
Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

ВЫ РЕГРЕСС ЭТО?
Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

Не зря же это называют интеллектом
Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

LeetCode Проблема 41. Первый пропущенный положительный результат
LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

Расистский и сексистский робот, обученный в Интернете
Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

Управление состоянием в микрофронтендах
Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..