安排自动“分析表”的方法有哪些?当大量数据通过插入和删除进行更改时,是否可以请求自动“分析表”?将自动分析表流程参数化的方法是什么,即在应该触发时设置规则。
发布于 2009-11-26 08:25:21
从理论上讲,您可以在表上执行AFTER INSERT触发器,从而自动触发DBMS_STATS。
但要小心你的愿望。如果您正在进行一个大型的DBMS_STATS作业,并且刚刚将一百万行插入到表中,那么您不一定希望立即自动启动一个ETL作业。同样,当你处于最繁忙的在线处理时间(例如午餐)时,你不会想要通过同时收集统计数据来减慢它的速度。
您通常希望这些统计信息收集在低使用率时段(晚上、周末)运行的作业。如果您有一个加载到许多表中的大型批处理运行,我会将DBMS_STATS构建到批处理中。
发布于 2009-11-26 06:00:47
您使用的是什么版本的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;
https://stackoverflow.com/questions/1800124
复制相似问题