数据库
首页 > 数据库> > oracle统计信息

oracle统计信息

作者:互联网

 

oracle 收集统计信息

本篇主要是从两个角度出发:

  1. 什么统计信息;
  2. 怎么正确收集统计信息(dbms_stats)

一、统计信息相关概念

  1. 什么是统计信息?
    oracle数据库中的统计信息存储在数据字典中,从多个维度描述了oracle数据库里的详细信息。

  2. 统计信息作用是什么?
    oracle CBO优化器会利用统计信息计算目标SQL各种可能、不同的执行路径的成本,并从中选择一条最小的执行路径来作为目标SQL的执行计划。(统计信息不准确,SQL的执行计划会走错,SQL会出现性能问题)

  3. 统计信息分类:

二、收集统计信息方法选择

oracle有两种方法收集统计信息,1、analyze;2、dbms_stats

2.1 analyze命令收集

oracle 7开始,通过analyze命令来收集表、索引、列的统计信息。以下是一些典型的用法。

analyze table test estimate statistics smaple 15 percent for table;
登录后复制
analyze table test compute statistics for table;
登录后复制

该模式下,只有test表有统计信息,test的列和索引都没有统计信息,且收集的统计信息和实际情况是一致的。

analyze table test compute statistics for cloumns 列1,列2;
登录后复制

只会对列1和列2收集统计信息,且之前的覆盖掉之前的收集统计信息。

analyze table test compute statistics for table for cloumns 列1,列2;
登录后复制
analyze index idx_1 statistics;
登录后复制
analyze table test delete statistics;
登录后复制
analyze index idx_1 delete statistics;
details/106810013
登录后复制

2.2 dbms_stats包收集统计信息

oracle 8.1.5开始,dbms_stats被广泛应用于统计信息收集,也是oracle官方推荐的方式。
dbms_stats有4个存储过程。

BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'SCOTT',
                                tabname          => 'TEST',
                                estimate_percent => 15, --采样比是15%
                                method_opt       => 'for table',
                                cascade          => false);  --默认是true,级联收集
END;
/
登录后复制
BEGIN
  DBMS_STATS.GATHER_INDEX_STATS(ownname          => 'SCOTT',
                                indname          => 'IDX_TEST',
                                estimate_percent => 100,
								);
END;
/
登录后复制
BEGIN
  DBMS_STATS.GATHER_SCHEMA_STATS(ownname		 => 'SCOTT',
                                cascade			 =>true,
                                granularity=>'ALL', --收集分区表
								);
END;
/
登录后复制
BEGIN
  DBMS_STATS.GATHER_DATABASE_STATS(estimate_percent=>100,
                                   degree=>8,
                                   cascade=>true,
                                   granularity=>'ALL', --收集分区表
								);
END;
/
登录后复制

2.2.1 DBMS_STATS重要参数详解

2.3 analyze和dbms_stats的区别

  1. analyze命令不能正确的手机分区表的统计信息,而dbms_stats包却可以。
  2. analyze命令不能并行收集统计信息,而dbms_stats包可以。
  3. analyze命令不能收集x$的统计信息
    所以选择推荐使用dbms_stats来对表进行统计信息收集。

3 推荐使用收集统计信息脚本

BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'SCOTT',
                                tabname          => 'TEST',
                                estimate_percent => 100,
                                method_opt       => 'for all columns size repeat',
                                no_invalidate    => FALSE,
                                degree           => 8,
                                granularity      => 'ALL',
                                cascade          => TRUE);
END;
/
登录后复制

需要注意选择的地方是:
estimate_percent
<1GB 建议采样比100%
1GB~5GB 建议采样比50%
>5GB 建议采样比30%
(朋友们可以自己尝试用存储过程去判断表大小,自定义收集统计信息脚本)
degree
根据服务器的资源,和业务负载来指定
method_opt
系统刚上线使用auto,业务系统稳定后使用repeat。

标签:stats,收集,信息,oracle,STATS,analyze,统计
来源: https://www.cnblogs.com/zmc60/p/15855456.html