Поэтому я недавно обновил Oracle Database 10g с 10.2.0.3.0 до 10.2.0.4.0, как было рекомендовано службой поддержки Oracle, из-за проблем со стабильностью (известная проблема в некоторых системах, когда экземпляр зависал случайным образом при высокой нагрузке).
После применения патча проблемы со стабильностью исчезли, но запросы выполняются НАМНОГО медленнее из-за постоянных ПОЛНЫХ СКАНИРОВАНИЙ таблиц, хотя я пересчитал статистику для всех таблиц во всех схемах, и индексы явно в порядке. Я также установил значение версии оптимизатора равным предыдущему (это также было рекомендовано службой поддержки Oracle), но пока оно не улучшилось.
Есть идеи по этому поводу?
Я запускаю следующий sql, чтобы запланировать задание для запуска статистики по устаревшим таблицам каждые 2 часа. Это предотвращает сбой многих SQL-запросов в 10g и 11g. Если в таблице не было изменено более 10% строк, запуск статистики будет пропущен до тех пор, пока не будет изменено 10% или более строк.
-- YOu must commit when you are finished to add the line to sys.job$/dba_jobs
-- You must run this as sys to get the jobs to run as sys to get the correct path to run the job
variable jobno number;
variable instno number;
begin
select max(job)+1 into :jobno from dba_jobs;
select instance_number into :instno from v$instance;
dbms_job.submit(:jobno,
'dbms_stats.gather_database_stats(options=>''gather stale'',estimate_percent=>100,degree=>4,cascade=>true);',
trunc(sysdate)+15/24, 'sysdate+2/24',
TRUE, :instno);
end;
/
commit;
Наконец, похоже, что проблема была вызвана плохо оптимизированным SQL. Кроме того, похоже, что экземпляр выполнял полное сканирование только тогда, когда его стоимость была ниже стоимости сканирования индекса, так что, по всей видимости, все в порядке.