有什么方法可以安排自动“分析表”。当大量数据通过插入和删除更改时,是否可以请求自动“分析表”?参数化自动分析表过程有哪些方法,即在应该触发时设置规则。
答案 0 :(得分:5)
您使用的是哪个版本的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;
答案 1 :(得分:2)
“当有大量数据发生变化时,有没有办法让这项工作被触发” 理论上,您可以在自动设置DBMS_STATS的表上执行AFTER INSERT触发器。
但要小心你的意愿。如果您正处于大型ETL作业的中间,只是在表中插入了一百万行,则不一定要立即自动设置DBMS_STATS作业。同样,当您处于最繁忙的在线处理时间(例如午餐)时,您不希望通过同时收集统计数据来减慢速度。
您通常希望这些统计信息收集在低使用率时段(夜晚,周末)运行的作业。如果你有一个大批量运行加载到很多表中,我会将DBMS_STATS构建到批处理中。