Я бы начал так.Таблицы разбиты на разделы и какие столбцы индексируются?Есть ли в таблицах последняя статистика?Есть ли у оракула все, что нужно для правильного выбора?Я удаляю / усекаю раздел и вставляю / вставляю с добавлением в эти таблицы, потому что HWM становится проблемой, если я удаляю с вставкой с добавлением.
То, что вы хотите, - это иметь Oracle, сделать правильный выбор плана выполнения.Вам нужны таблицы, разделы и индексы, чтобы иметь последнюю статистику по ним.
begin
DBMS_STATS.GATHER_TABLE_STATS
(OWNNAME => lv_schema_from,
TABNAME => lv_table_from,
ESTIMATE_PERCENT => 15, --15% for ~100000 of record, 15%-100% for less METHOD_OPT => 'FOR ALL COLUMNS SIZE AUTO',
GRANULARITY => 'AUTO', --only if you have partitioned table
DEGREE => 8, --parallel
CASCADE => TRUE); --cascade to indexes
end;
Это может изменить план выполнения (в лучшую сторону).
Впоследствии, если это тот же план выполненияЯ бы начал с типа соединения между таблицами и параллельной подсказкой (сколько ядер доступно?).
Что лучше?Чтение из D или LO сначала -> ведущая подсказка для самой маленькой таблицы таблиц с внутренним соединением между ними (на всякий случай).
Хочу ли я использовать индекс?если я посмотрю 9.000.000 записей в таблицу 300.000.000 (3%), используя индекс, это может занять полчаса.В моем случае быстрее использовать use_hash или полные подсказки, чем позволить индексу оракула идти.
Эксперимент ... разное количество ядер, PGA, SGA, статистика (наиболее важная) заставляет CBO по-разному оценивать оптимальный план выполнения длятот же запрос.
Лучше всего было бы обратиться к источнику проблемы, и это было бы ответом на вопрос, почему Oracle выбрала этот план выполнения? Большую часть времени статистика таблиц, разделов и индексов.