Подсказка оракула для использования индексов подзапроса - Oracle SQl - PullRequest
1 голос
/ 17 августа 2011

У меня есть запрос следующим образом

select *
from
( select id,sum(amt) amt from table_t group by id
) t inner join table_v v on (v.id = t.id)
order by t.amt desc;

table_t не имеет индекса и имеет 738 000 строк, а table_v имеет индекс по id и имеет 158 000 строк.

В настоящее время запрос извлекает результатычерез 10 секунд.

План запроса объяснения показывает полное сканирование таблицы. Как я могу улучшить производительность здесь?

Если я добавлю индекс по id для table_t, это поможет.Потому что я использую его в подзапросе?

1 Ответ

2 голосов
/ 18 августа 2011

Если у вас есть индекс на (id,amt), вы бы минимизировали работу в группе с помощью процесса / суммирования (так как он мог бы прочитать индекс).Если оба столбца обнуляются, вам может понадобиться добавить «где id не нуль», поэтому он будет использовать индекс.[Это подразумевается в последующем объединении id, но оптимизатор может не вывести его.]

Следующим шагом будет использование материализованного представления для суммирования, возможно, с индексом (amt,id) (который он мог бы использовать, чтобы избежать сортировки).Но это обновляется либо при фиксации, либо по запросу, либо через запланированные интервалы.Это не поможет, если вам нужно выполнить этот запрос как часть транзакции.

И индекс, и материализованное представление добавят работу для вставок / обновлений / удалений в таблицу, но сохранят работу в этом запросе.

...