Oracle调优/分析表

时间:2009-11-25 21:34:58

标签: oracle performance

有什么方法可以安排自动“分析表”。当大量数据通过插入和删除更改时,是否可以请求自动“分析表”?参数化自动分析表过程有哪些方法,即在应该触发时设置规则。

2 个答案:

答案 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构建到批处理中。