В дальнейшем я предполагаю, что covered_entity_id
- это то же самое, что и store_num
- это действительно облегчит нам задачу, если вы будете последовательны в своем наименовании.
Подавляющее большинство записей в т1
есть store_num.
Учитывая, что это так, следующий пункт не должен влиять на производительность вашего запроса ...
where covered_entity_id is not null
Однако вы продолжаете говорить
часть запроса, которая принимает
самое длинное - полное сканирование на t1
ищу store_num
Это говорит о том, что запрос сначала ищет covered_entity_id is not null
, а не, предположительно, гораздо более избирательный table_oid = 1234
. Решение может быть так же просто, как переписать запрос, как этот ...
where table_oid = 1234
and covered_entity_id is not null;
... хотя я подозреваю, что нет. Вы можете попробовать подсказку, чтобы запрос использовал индекс на table_oid
.
Другое дело, насколько свежа статистика? Когда оптимизатор выбирает радикально неверный план выполнения, это часто происходит потому, что статистика устарела.
Кстати, почему вы вообще присоединяетесь к T2? Ваши требования могут быть удовлетворены путем выбора max(id)
из T1 (если только у вас нет внешнего ключа, обеспечивающего T1.ID
ссылки T2.T2_ID
, и, следовательно, необходимо быть уверенным).
редактировать
Чтобы проверить статистику, запустите этот запрос:
select table_name
, num_rows
, last_analyzed
from user_tables
where table_name in ('T1', 'T2')
/
Если результаты показывают, что num_rows
сильно отличается от значений, которые вы указали при первом редактировании, вам следует заново собрать статистику. Если last_anlayzed
- это что-то вроде того дня, когда вы начали жить, то вам определенно стоит пересобраться. Вы можете сначала экспортировать свою статистику; обновление статистики может повлиять на планы выполнения (что является целью упражнения), как правило, навсегда, но иногда дела могут ухудшиться. Узнать больше .