代码之家  ›  专栏  ›  技术社区  ›  paweloque

Oracle调整/分析表

  •  2
  • paweloque  · 技术社区  · 15 年前

    计划自动“分析表”的方法是什么?当大量数据因插入和删除而发生更改时,是否可以请求自动“分析表”?将自动分析表过程参数化的方法是什么,即在应该触发时设置规则。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Gary Myers    15 年前

    “有没有办法在很大比例的数据发生更改时触发此作业?” 理论上,您可以在一个表上执行一个after-insert触发器,该触发器自动设置DBMS U状态。

    但是要小心你想要的。如果您正处于一个大型ETL作业的中间,刚刚向表中插入了一百万行,则不一定希望立即自动启动DBMS_Stats作业。同样,当你处于最繁忙的在线处理时间(如午餐)时,你不想通过同时收集统计数据来降低速度。

    您通常希望这些统计信息收集在低使用时间段(晚上、周末)运行的作业。如果您有一个加载到许多表中的大型批处理运行,那么我将在该批处理中构建DBMS_状态。

        2
  •  5
  •   Justin Cave    15 年前

    您使用的是什么版本的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;