drop table test;

select count(*) from test;
--创建测试表
create table test
(
id number(9),
nick varchar2(30)
);

--插入测试数据
begin
  for i in 1..100000 loop
        insert into test(id) values(i);
  end loop;
  commit;
end;

select * from test;

--更新nick字段,使数据发生严重倾斜
update test set nick='abc' where rownum<99999;

--创建索引
create index idx_test_nick on test(nick);

update test set nick='def' where nick is null;

--只对索引进行分析
analyze index idx_test_nick compute statistics;

select * from user_indexes;
--查看索引名,对应存储的数据块,不同的key数量,记录数(行数)的分析信息
select index_name, LEAF_BLOCKS, DISTINCT_KEYS, NUM_ROWS
  from user_indexes
 where index_name = 'IDX_TEST_NICK';

--dba_tab_col_statistics

--查看表的统计信息
select COLUMN_NAME, NUM_BUCKETS, num_distinct
  from USER_tab_columns
 where table_name = 'TEST';

select * from test where nick ='abc';
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'TEST'
   2    1     INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE)

select * from test where nick ='def';
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'TEST'
   2    1     INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE)
--由上可以看到,对索引分析之后,sql的执行路径都是基于规则的,索引的字段的偏移
--先根据索引找到rowid,然后再根据rowid读取记录,这个过程肯定比全表扫描读取记录要慢

--user_part_col_statistics  分区分析信息

--分析表的第二列nick
analyze table test compute statistics for columns size 2 nick;

select * from test where nick ='abc';
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'TEST'
   2    1     INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE)
--根据上面的执行计划,还是按照规则来执行的

--分析表
analyze table test compute statistics for table;

select * from test where nick ='abc';
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=49 Card=99998 Bytes=
          1499970)

1    0   TABLE ACCESS (FULL) OF 'TEST' (Cost=49 Card=99998 Bytes=14
          99970)
--分析表之后,完全按照成本来执行

--删除所有的统计数据,并只对表与列进行分析,不分析索引,
--ORACLE使用CBO的优化器,并产生了正确的执行计划
analyze table test delete statistics;

--分析列nick
analyze table test compute statistics for table for columns size 2 nick;

select * from test where nick ='abc';
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=49 Card=99998 Bytes=
          1499970)

1    0   TABLE ACCESS (FULL) OF 'TEST' (Cost=49 Card=99998 Bytes=14
          99970)
  
--
select * from test where nick ='def';
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=2 Bytes=30)
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=2 Byt
          es=30)

2    1     INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE) (Cost
          =1 Card=2)

--创建TEST表ID列上的索引,但不对索引进行分析
create index idx_test_id on test(id);
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1000 Bytes=15
          000)

1    0   TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1000
          Bytes=15000)

2    1     INDEX (RANGE SCAN) OF 'IDX_TEST_ID' (NON-UNIQUE) (Cost=1
           Card=400)

--当条件中即有id,又有nick时,因为nick上有直方图,ORACLE知道nick='abc'的值特别的多,所以不走IDX_TEST_NICK索引,走IDX_TEST_ID上的索引
select * from test where id=5 and nick='abc';
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1000 Bytes=15
          000)

1    0   TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1000
          Bytes=15000)

2    1     INDEX (RANGE SCAN) OF 'IDX_TEST_ID' (NON-UNIQUE) (Cost=1
           Card=400)

--当条件中即有id,又有nick时,因为nick上有直方图,ORACLE知道nick='def'的值特别的少,所以走IDX_TEST_NICK上的索引,不走IDX_TEST_ID索引
select * from test where id=5 and nick='def';
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=15)
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt
          es=15)

2    1     INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE) (Cost
          =1 Card=2)

select * from test where nick='def'  and id=5;
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=15)
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt
          es=15)

2    1     INDEX (RANGE SCAN) OF 'IDX_TEST_NICK' (NON-UNIQUE) (Cost
          =1 Card=2)

--在分析ID列后,ORACLE发现ID列的选择度更高,所以不再选择IDX_TEST_NICK索引,而是选择IDX_TEST_ID
analyze table test compute statistics for columns size 1 id;
select * from test where id=5 and nick='def';
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=7)
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt
          es=7)

2    1     INDEX (RANGE SCAN) OF 'IDX_TEST_ID' (NON-UNIQUE) (Cost=1
           Card=1)
          
/*
下面来看另外一种情况,我们删除所有的统计数据,然后在ID列上创建唯一索引,在此条件下,
只分析表与分析列nick,我们看到ORACLE走了正确的执行计划,
走了UK_TEST_ID,其实从这里也给我们带来很多的启示:
在主键与唯一键约束的列上是否需要直方图的问题?
如果在这些列上有像这样的查询where id > 100 and id < 1000,
我们还是需要有直方图的,但除此之外,好像真的没有直方图的必要了!
*/
analyze table test delete statistics;   
drop index idx_test_id;
create unique index uk_test_id on test(id);
--分析表的第二列nick
analyze table test compute statistics for table for columns size 2 nick;
select * from test where id=5 and nick='def';
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=15)
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt
          es=15)

2    1     INDEX (UNIQUE SCAN) OF 'UK_TEST_ID' (UNIQUE) (Cost=1 Car
          d=100000)
         
从以上一系列的实验可以看出,对ORACLE的优化器CBO来说,表的分析与列的分析才是最重要的,索引的分析次之。还有我们可以考虑我们的哪些列上需要直方图,对于bucket的个数问题,oracle的默认值是75个,所以根据你的应用规则,选择合适的桶数对性能也是有帮助的。因为不必要的桶的个数的大量增加,必然会带来SQL语句硬解析时产生执行计划的复杂度问题。

完全计算法: analyze table abc compute statistics;
抽样估算法(抽样20%): analyze table abc estimate statistics sample 20 percent

对表作完全计算所花的时间相当于做全表扫描,抽样估算法由于采用抽样,比完全计算法的生成统计速度要快,假如不是要求要有精确数据的话,尽量采用抽样分析法。建议对表分析采用抽样估算,对索引分析可以采用完全计算。
我们可以采用以下方法,对数据库的表和索引及簇表定期分析生成统计信息,保证应用的正常性能

生成索引分析,表分析的sql语句:

转载于:https://www.cnblogs.com/sopost/archive/2010/09/16/2190083.html

oracle表分析 示例相关推荐

  1. oracle表分析都分析什么,oracle表分析

    analyze table tablename compute statistics; analyze index indexname compute statistics; 对于使用CBO很有好处, ...

  2. oracle 表分析 影响,oracle 表分析

    在使用DBMS_STATS分析表的时候,我们经常要保存之前的分析,以防分析后导致系统性能低下然后进行快速恢复. 首先创建一个分析表,该表是用来保存之前的分析值. SQL> begin 2   d ...

  3. Oracle 表分析缩表,MySQL中的表分析

    零:说在前面 众所周知,Oracle中,对于大量增删改操作的表需要定时进行表分析,以便回收被标记废弃的磁盘空间,缩减表的实际大小.对于异常状态的索引,也需要定时对索引进行重构. MySQL中亦有类似需 ...

  4. oracle 表分析 分区,细化解析:Oracle表分区

    Oracle表分区里可以把一个表分割为多个小部分,这样可以对Oracle表分区的查询性能,管理表数据,备份和恢复操作的性能优化带来改善. Oracle表分区分为好几种的(范围分区,散列分区,子分区,列 ...

  5. oracle语法分析表,Oracle表分析

    表.索引等方案的分析 为什么要分析? 在一个采用基于CBO优化器的数据库中,为了选择更加的理想的执行计划.必须定时的对表.索引等方案进行分析.因为在对表进行大量的DML操作之后,索引等结构上可能会发生 ...

  6. 20190624 Oracle 表分析

    dbms_stats.gather_table_stats(...) 参数要注意 正常情况只是为了分析表,也可以通过方法创建记录表 分析的结果会记录的记录表中,当然每次运行会有覆盖,主要分析后的结果. ...

  7. oracle表分析效果怎么看,Oracle 索引与表分析几种方法

    分析表与索引有几种方法,现在列举出来参考下. 1.分析表与索引(analyze 不会重建索引) analyze table tablename compute statistics 等同于 analy ...

  8. oracle查询表实际大小,简要分析估算oracle表的大小

    查询oracle表的大小有几种方法,笔者简要分析下他们的异同 环境,newsadmin.newlog,原本有244,459,078条记录,delete后,现在只有51,109,919记录. 一.seg ...

  9. 导出oracle awr分析报告,配置oracle内存参数,察看表空间使用率

    cmd 命令生成awr报告: cmd 窗口 输入 -> Sqlplus sys/orcl@orcl as sysdba  (sys登陆oracle) . 导出awr命令 @?/rdbms/adm ...

最新文章

  1. Python最大堆排序实现方法
  2. 谈谈被大家过于在乎的性能
  3. Android开发——跟随手指的小球实现
  4. 类模板非类型形参实现Stack
  5. 合并两个已经排好序的不等长的数组
  6. contentwindow无法搜索对象_面试官:讲一下Jvm中如何判断对象的生死?
  7. Django(模板语言-自定义filter和simple_tag)
  8. c++程序设计中多态与虚函数知识点
  9. C#获取文件(磁盘驱动器)的关联图标(使用API SHGetFileInfo)
  10. 利用Xcode在Mac写第一个C++ project
  11. 安装meme_新的Meme订单:通过简单的浏览器缓存更改游戏
  12. Linux建立信任主机
  13. 『DL笔记』预训练(pre-training/trained)与微调(fine tuning)
  14. pdf怎么转换成图片,pdf转图片教程
  15. ESP32S2(12K)-DS18B20数码管显示温度
  16. 国标SVAC对飙通行标准,优势何在?
  17. 大数据三维可视化展示系统的应用分析
  18. 前端下载其他服务器上的跨域图片资源问题
  19. android 相机功能修改,Android11不再支持更改默认相机程序,再也不能用美颜相机拍照了...
  20. 数据结构课程设计报告——Huffman编码

热门文章

  1. IBM 火雪挺:人工智能如何影响衣食住行?
  2. 为什么美国的程序员工作轻松、还加班少? 公众号程序员江湖
  3. CSS height:100%无效
  4. Java Web之文件的上传及下载
  5. bzoj4514[Sdoi2016]数字配对
  6. JS 处理Json 时间带T 时间格式
  7. linux下rpm方式安装mysql5.6及问题解决
  8. Memcached服务器的图形化管理工具
  9. OpenGL环境下的射线选择
  10. 一种使用蒸汽眼罩保养的方法