暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 19C 收集工作量统计信息

原创 Asher.HU 2021-02-04
1534

Oracle建议您DBMS_STATS.GATHER_SYSTEM_STATS在数据库具有最典型的工作负载时捕获统计信息。

例如,数据库应用程序可以在白天处理OLTP事务,并在晚上生成OLAP报告。

 

13.4.3.2.1关于工作量统计

工作负载统计信息分析指定时间段内的活动。

工作负载统计信息包括表13-4中列出的以下统计信息

  • 单块(sreadtim)和多块(mreadtim)的读取时间
  • 多块计数(mbrc
  • CPU速度(cpuspeed
  • 最大系统吞吐量(maxthr
  • 平均并行执行吞吐量(slavethr

数据库单位计算sreadtimmreadtim以及mbrc通过比较物理顺序的数量和随机的时间从开始到工作负载的末尾两个点之间的读取。数据库通过计数器实现这些值,这些计数器在缓冲区高速缓存完成同步读取请求时会更改。

由于计数器位于缓冲区高速缓存中,因此它们不仅包括I / O延迟,还包括与锁存器争用和任务切换有关的等待。因此,工作负载统计信息取决于工作负载窗口期间的系统活动。如果系统受I / O限制(闩锁争用和I / O吞吐量),那么在数据库使用统计信息后,统计信息会促进I / O密集型计划的减少。

如图13-4所示,如果您收集工作负荷统计信息,那么优化器将使用mbrc为工作负荷统计信息收集值来估计全表扫描的成本。

图13-4工作负载统计计数器

收集工作负载统计信息时,如果在串行工作负载期间没有进行表扫描,则数据库可能不会收集mbrcmreadtim值,这是OLTP系统的典型情况。但是,全表扫描在DSS系统上经常发生。这些扫描可以并行运行,并绕过缓冲区高速缓存。在这种情况下,数据库仍会收集数据,sreadtim因为索引查找使用缓冲区高速缓存。

如果数据库无法收集或验证聚集mbrcmreadtim值,但已经聚集sreadtimcpuspeed那么只有数据库使用,sreadtimcpuspeed为成本计算。在这种情况下,优化器使用初始化参数的值DB_FILE_MULTIBLOCK_READ_COUNT来进行全表扫描。但是,如果设置DB_FILE_MULTIBLOCK_READ_COUNT为is 0或not,则优化器使用值8来计算成本。

使用该DBMS_STATS.GATHER_SYSTEM_STATS过程收集工作负载统计信息。GATHER_SYSTEM_STATS过程将使用经过的时间段的统计信息刷新数据字典或登台表。若要设置收集的持续时间,请使用以下两种技术之一:

  • 指定START工作负载窗口的开头,然后STOP在工作负载窗口的末尾。
  • 指定INTERVAL以及统计信息自动停止之前的分钟数。如果需要,您可以用来GATHER_SYSTEM_STATS (gathering_mode=>'STOP')提前结束计划的收集。

也可以看看:

Oracle数据库参考,了解DB_FILE_MULTIBLOCK_READ_COUNT初始化参数


13.4.3.2.2启动和停止系统统计信息收集

本教程说明了如何使用STARTSTOP参数设置工作负载间隔GATHER_SYSTEM_STATS

假设条件

本教程假定以下内容:

  • 上午10点至11点之间的时间代表每日的工作量。
  • 您打算直接在数据字典中收集系统统计信息。

要使用START和STOP收集工作负载统计信息:

  1. 启动SQL * Plus,并以管理员权限连接到数据库。
  2. 开始收集统计信息。

    例如,在上午10点,执行以下过程以开始收集:

    EXECUTE DBMS_STATS.GATHER_SYSTEM_STATS( gathering_mode => 'START' );
    
  3. 生成工作量。
  4. 结束统计信息收集。

    例如,在上午11点,执行以下过程以结束收集:

    EXECUTE DBMS_STATS.GATHER_SYSTEM_STATS( gathering_mode => 'STOP' );
    

    现在,优化器可以使用工作负载统计信息来生成在正常的日常工作负载期间有效的执行计划。

  5. (可选)查询系统统计信息。

    例如,运行以下查询:

    COL PNAME FORMAT a15
    SELECT PNAME, PVAL1 
    FROM   SYS.AUX_STATS$ 
    WHERE  SNAME = 'SYSSTATS_MAIN';

也可以看看:

Oracle Database PL / SQL软件包和类型参考以了解该DBMS_STATS.GATHER_SYSTEM_STATS过程

 

13.4.3.2.3在指定间隔内收集系统统计信息

本教程说明如何使用INTERVAL参数设置工作负载间隔GATHER_SYSTEM_STATS

假设条件

本教程假定以下内容:

  • 数据库应用程序在白天处理OLTP事务,并在晚上运行OLAP报告。为了收集代表性统计数据,您需要在白天收集两个小时,然后在夜间收集两个小时。
  • 您要将统计信息存储在名为的表中workload_stats
  • 您打算在收集的统计信息之间切换。


要使用INTERVAL收集工作量统计信息:

  1. 启动SQL * Plus并以管理员身份连接到生产数据库dba1
  2. 创建一个表来保存生产统计信息。

    例如,执行以下PL / SQL程序以创建用户统计表workload_stats

    BEGIN
      DBMS_STATS.CREATE_STAT_TABLE (
          ownname  =>  'dba1'
    ,     stattab  =>  'workload_stats'
    );
    END;
    /
    
  3. 确保JOB_QUEUE_PROCESSES不是0这样,以便DBMS_JOB作业和Oracle Scheduler作业运行。
    ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 1;
    
  4. 收集白天的统计信息。

    例如,使用以下程序收集两个小时的统计信息:

    BEGIN
      DBMS_STATS.GATHER_SYSTEM_STATS ( 
          interval  =>  120
    ,     stattab   => 'workload_stats'
    ,     statid    => 'OLTP' 
    );
    END;
    /
    
  5. 晚上收集统计数据。

    例如,使用以下程序收集两个小时的统计信息:

    BEGIN
      DBMS_STATS.GATHER_SYSTEM_STATS (
          interval  =>  120
    ,     stattab   => 'workload_stats' 
    ,     statid    => 'OLAP' 
    );
    END;
    /
    
  6. 在白天或晚上,将适当的统计信息导入数据字典。

    例如,在白天,您可以使用以下程序将OLTP统计信息从登台表导入字典中:

    BEGIN
      DBMS_STATS.IMPORT_SYSTEM_STATS (
          stattab  =>  'workload_stats'
    ,     statid   =>  'OLTP' 
    );
    END;
    /
    

    例如,在晚上,您可以使用以下程序将OLAP统计信息从登台表导入到字典中:

    BEGIN
      DBMS_STATS.IMPORT_SYSTEM_STATS (
          stattab  =>  'workload_stats'
    ,     statid   =>  'OLAP' 
    );
    END;
    /

也可以看看:

Oracle Database PL / SQL软件包和类型参考以了解该DBMS_STATS.GATHER_SYSTEM_STATS过程

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论