最近在学习Oracle的统计信息这一块,收集统计信息的方法如下:

DBMS_STATS.GATHER_TABLE_STATS (
ownname VARCHAR2, ---所有者名字
tabname VARCHAR2, ---表名
partname VARCHAR2 DEFAULT NULL, ---要分析的分区名
estimate_percent NUMBER DEFAULT NULL, ---采样的比例
block_sample BOOLEAN DEFAULT FALSE, ---是否块分析
method_opt VARCHAR2 DEFAULT ‘FOR ALL COLUMNS SIZE 1’,---分析的方式
degree NUMBER DEFAULT NULL, ---分析的并行度
granularity VARCHAR2 DEFAULT ‘DEFAULT’, ---分析的粒度
cascade BOOLEAN DEFAULT FALSE, ---是否分析索引
stattab VARCHAR2 DEFAULT NULL, ---使用的性能表名
statid VARCHAR2 DEFAULT NULL, ---性能表标识
statown VARCHAR2 DEFAULT NULL, ---性能表所有者
no_invalidate BOOLEAN DEFAULT FALSE, ---是否验证游标依存关系
force BOOLEAN DEFAULT FALSE); ---强制分析,即使锁表

本文主要对参数granularity进行了一下验证,

granularity:数据分析的力度

--global  ---全局

--partition ---只在分区级别做分析

--subpartition  --只在子分区级别做分析

验证步骤如下:

一、创建一个分区表并插入两条数据,同时在字段ID上创建索引
drop table test purge;
create table test(id number) partition by range(id)
(partition p1 values less than (5),
partition p2 values less than (10)
) ;
insert into test values(1);
insert into test values(6);
commit;
create index ind_id on test(id);
二、收集表的统计信息
exec dbms_stats.gather_table_stats(user,'TEST',cascade=>true);
三、查询表的统计信息
select num_rows,blocks,last_analyzed from user_tables where table_name = 'TEST';
结果如下:

num_rows:表数据行数
blocks:数据块数
last_analyzed:最近分析时间
四、查询表分区信息
select partition_name,num_rows,blocks,last_analyzed from dba_tab_partitions where table_name ='TEST';

PARTITION_NAME:分区名称
NUM_ROWS:数据行数
BLOCKS:数据块数
last_analyzed:最近分析时间
五、查询索引统计信息
select num_rows,blevel,last_analyzed from user_indexes where index_name = 'IND_ID';

num_rows:索引数据行数
blevel:索引高度
last_analyzed:分析时间
六、新增一个分区
alter table test add partition pmax values less than(maxvalue);
七、往新的分区中插入10000条数据
begin for i in 1..10000 loop ---插入10000条数据
insert into test values(100);
end loop;
commit;
end;
八、创建一个倾斜度非常大的分区
update test set id=10000 where id=100 and rownum=1; ---创造一个非常倾斜的Pmax分区
Commit;
九、查询分区数据
select id,count(*) from test partition(pmax) group by id;

十、不做分析,再次查询表的统计信息
select num_rows,blocks,last_analyzed from user_tables where table_name = 'TEST';

发现数据行数量和数据块数量没有发现变化
十一、查询id=100时执行计划
set autotrace traceonly
set linesize 1000
select * from test where id=100;

发现走了索引,正常情况下,因为id=100的数据在一个倾斜度非常高的分区pmax中,id为100的数据有9999条,走索引的代价会比走全表的代价还要高(因为走索引需要回表),如果统计信息正确,优化器应该会选择走全表,但是这里没走全表而是走了索引,这里怀疑是统计信息不正确导致,后面验证
十二、收集分区统计信息
exec dbms_stats.gather_table_stats(user,'TEST',partname => 'PMAX',granularity => 'PARTITION');
十三、再次查询表的统计信息和分区统计信息
select partition_name,num_rows,blocks,last_analyzed from dba_tab_partitions where table_name ='TEST';

发现和步骤四比较,分区信息有了变化,说明对分区进行统计信息收集后,分区信息进行了更新
select num_rows,blocks,last_analyzed from user_tables where table_name = 'TEST';

发现和步骤三想比,表的统计信息并没有发生变化,说明统计了分区信息后,表的统计信息么有更新

十四、再次查询id=100的数据

仍然走索引,说明在评估查询的时候,表的统计信息依然陈旧
十五、查询索引的统计信息
select num_rows,blevel,last_analyzed from user_indexes where index_name = 'IND_ID';

发现索引统计信息较步骤五没有变化,说明收集了分区的统计信息后,表的索引信息没有更新

十六、重新再次收集表的统计信息
exec dbms_stats.gather_table_stats(user,'TEST',cascade =>true);
十七、查询表的统计信息以及索引的统计信息
select num_rows,blocks,last_analyzed from user_tables where table_name = 'TEST';

表的统计信息已经更新
select num_rows,blevel,last_analyzed from user_indexes where index_name = 'IND_ID';

索引的统计信息也已经更新
十八、再次查询id=100的执行计划

这次发现走了全表,说明收集了全局的统计信息后,表的统计信息准确了,评估也就准确了。

转载于:https://www.cnblogs.com/jerome-lamb/p/7535014.html

验证Oracle收集统计信息参数granularity数据分析的力度相关推荐

  1. Oracle收集统计信息之NO_INVALIDATE参数

    Oracle收集统计信息之NO_INVALIDATE参数 Oracle统计量对于CBO执行是至关重要的.RBO是建立在数据结构的基础上的,DDL结构.约束会将SQL语句分为不同的成本结构等级.而CBO ...

  2. Oracle收集统计信息

    Oracle收集统计信息 优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN: 列统计: --列中唯一值的数量(NDV ...

  3. oracle收集统计计划,oracle收集统计信息之analyze

    oracle收集统计信息之analyze 1.analyze 收集表,索引的统计信息,现在oracle不推荐用analyze收集统计信息 收集表的统计信息Analyze table tablename ...

  4. oracle收集统计信息之analyze

    oracle收集统计信息之analyze 1.analyze 收集表,索引的统计信息,现在oracle不推荐用analyze收集统计信息  收集表的统计信息Analyze table tablenam ...

  5. oracle收集统计信息sql,Oracle自动统计信息的收集原理及实验

    从Oracle Database 10g开始,Oracle在建库后就默认创建了一个名为GATHER_STATS_JOB的定时任务,用于自动收集CBO的统计信息.这个自动任务默认情况下在工作日晚上10: ...

  6. oracle 收集统计信息会锁表吗,统计信息锁住导致收集统计信息失败引起sql执行异常...

    这个是老生产谈的事情,统计信息不准确导致sql执行异常,此次记录的主要是表的统计信息被锁住导致无法正常收集统计信息导致sql执行异常: 收集表的统计信息: SQL> exec DBMS_STAT ...

  7. num_rows为NULL时,进行Oracle收集统计信息

    对数据库进行导入导出或者数据发生变更,可能导致num_rows都为null,所以需要Oracle去收集统计信息,使得num_rows字段有数据 Oracle中的统计信息 使用DBMS_STATS.GA ...

  8. oracle收集统计信息和直方图,oracle统计信息和直方图

    oracle统计信息和直方图的理解[@more@]以前一直对统计信息的理解就是对行的数据分布的,提供改CBO来选择高效的执行计划.这段时间看了不少资料,对统计有了一个更清晰的认识 统计信息: 1,表中 ...

  9. oracle并行收集统计信息慢,Oracle 学习之性能优化(四)收集统计信息

    emp表有如下数据.SQL> select ename,deptno from emp; ENAME   DEPTNO ------------------------------ ------ ...

最新文章

  1. python def函数报错详解_python所有内置函数的定义详解
  2. 列表(list)之一定义 添加 删除 排序 反转 索引等其他操作
  3. Sybase数据库在UNIX、Windows上的实施和管理 出版预告
  4. 初学者对python的认识_Python初学者列表,python,初识
  5. work节点使用外部包_AFLSmart工具简单分析及使用介绍
  6. hibernate 简单笔记(一)
  7. 出版物排版软件——对XML数据进行排版、浏览、转换、打印
  8. ural 1012K-based Numbers. Version 2 1013. K-based Numbers. Version 3
  9. 管理员权限自动注册Dll文件
  10. 平面设计中的网格系统pdf_小白新手想要系统学习平面设计要看哪些书?
  11. Java Excel导出(包含图片) —— Easypoi
  12. java timer暂停_暂停/停止和启动/恢复Java TimerTask?
  13. UE4 UE4 C++ Gameplay Abilities的GameplayCue
  14. 转:CEO, CFO, CIO, CTO, CSO是什么
  15. 医疗器械行业迎来黄金十年,集团采购系统助力企业把握机遇,实现高质量发展
  16. 数据挖掘-二项逻辑斯蒂回归模型算法的R实现
  17. Ribbon的简单介绍和使用
  18. mongodb知识点汇总
  19. 控制台报错:Unknown database ‘xxxxx‘
  20. 大一网页设计期末大作业,HTML+CSS静态网站

热门文章

  1. do还是doing imagine加to_啤酒,还是精酿好
  2. c mysql 设置字符集_MYSQL字符集设置的方法详解(终端的字符集)
  3. 读取文件慢_页面缓存(Page Cache)-内存和文件之间的那点事儿(下)
  4. c语言 中多一个分号,问什么C程序里总是提示缺少分号;,而明明有分号?
  5. python图片二值化处理百度图api_Python+百度AI实现图像处理-附源码
  6. C#中主窗体Panel中加载其他多个窗体Panel控件
  7. 关于静态库与动态库【Linux 】【C】
  8. 2018程序员不能错过的编程挑战网站 Top10
  9. 使用线性回归的预测建模
  10. 中石油在意大利加油站0.5分/升,会不会赔死啊?