Oracle выберите * из всех последовательностей слишком медленно - PullRequest
2 голосов
/ 03 апреля 2020

Мой проект использует Hibernate, и я хотел увеличить время запуска (в настоящее время 1,5 минуты), поэтому я проверил, что происходит при запуске. Во время инициализации SessionFactory один из выполненных запросов:

select * from all_sequences;

Это занимает около минуты! Тот же запрос от Oracle SQL Разработчик занимает аналогичное количество времени. Всего возвращено записей: 102.

Существуют и другие запросы, которые выполняются нормально (время отклика - одна ди git мс)

Почему это так медленно?

1 Ответ

2 голосов
/ 04 апреля 2020

Сбор статистики оптимизатора для словаря данных и фиксированных объектов:

begin
    dbms_stats.gather_dictionary_stats;
    dbms_stats.gather_fixed_objects_stats;
end;
/

Oracle нужна хорошая статистика для объектов для построения хороших планов выполнения. Существует множество механизмов сбора статистики для наших пользовательских объектов, но иногда нам также необходимо собирать статистику для системных объектов. (Хотя я удивлен, что это необходимо прямо из коробки. Обычно эти проблемы возникают только после экстремальных изменений, таких как создание миллиона новых последовательностей.)

Если сбор статистики оптимизатора не помогает, попробуйте сгенерировать план выполнения с указанными ниже шагами и публикацией результата в вопросе.

--Run the query:
select /*+ gather_plan_statistics */ * from all_sequences;

--Find the SQL_ID:
select * from gv$sql where sql_text like '%gather_plan_statistics%';

--Generate the execution plan, with estimated and actual results.
select *
from table(dbms_xplan.display_cursor(sql_id => '9wgbmhhrf0bwr', format=>'ALLSTATS LAST'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...