Какую версию Oracle вы используете? Начиная с 10.1, Oracle поставляется с автоматическим заданием, которое каждую ночь собирает статистику по любому объекту, который был существенно изменен (на основе внутреннего алгоритма, который может быть изменен, но я считаю, что порог составляет ~ 15%) с тех пор, как в последний раз статистика была собрались. Если вы используете поддерживаемый в настоящее время выпуск, статистика собирается автоматически по умолчанию, если вы явно не отключили это задание.
Вы можете использовать пакет DBMS_STATS
для сбора статистики по объекту на основе события, и вы можете использовать пакет DBMS_JOB
(или DBMS_SCHEDULER
), чтобы сделать это асинхронно. Таким образом, в конце процесса ETL вы можете собрать статистику
BEGIN
dbms_stats.gather_table_stats(
ownname => <<schema name>>,
tabname => <<table name>>
);
END;
Вы можете запустить его асинхронно
DECLARE
l_jobno INTEGER;
BEGIN
dbms_job.submit(
l_jobno,
'BEGIN dbms_stats.gather_table_stats( ''<<schema name>>'', ''<<table name>>'' ); END;',
sysdate + interval '1' minute
);
END;