Oracle-表分析和索引分析解读
概述
当表没有做分析的时候,Oracle 会使用动态采样来收集统计信息。 获取准确的段对象(表,表分区,索引等)的分析数据,是CBO存在的基石,CBO的机制就是收集尽可能多的对象信息和系统信息,通过对这些信息进行计算,分析,评估,最终得出一个成本最低的执行计划。
所以对于CBO,数据段的分析就非常重要。
分析SQL
analyze table tablename compute statistics
等同于
analyze table tablename compute statistics for table for all ndexes for all columns
for table的统计信息存在于视图:user_tables 、all_tables、dba_tables
for allindexes的统计信息存在于视图: user_indexes 、all_indexes、dba_indexes
for allcolumns的统计信息存在于试图:user_tab_columns、all_tab_columns、dba_tab_columns
或者 SQL> exec dbms_stats.gather_table_stats(user,'xiaogongjiang');
生成的统计信息会存在于user_tables这个视图,查看一下 select * from user_tables where table_name=table_name;
观察一下NUM_ROWS,BLOCKS,AVG_SPACE,AVG_ROW_LEN几列你就会明白,这就是变化。
删除SQL
analyze table tablename delete statistics 会删除所有的statistics
作用
Oracle分析表的作用:为了使基于CBO的执行计划更加准确
栗子
数据准备
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Connected as xx@xgj
SQL> create table xiaogongjiang as select a.OBJECT_ID ,a.OBJECT_NAME from dba_objects a ;--创建表
Table created
SQL> select count(1) from xiaogongjiang;
COUNT(1)
----------
35183
SQL> create index idx_object_id on xiaogongjiang(object_id);--在object_id建立索引
Index created
SQL>
分析前的数据及执行计划
SQL> select num_rows, avg_row_len, blocks, last_analyzed from user_tables where table_name = 'XIAOGONGJIANG';--表的信息
NUM_ROWS AVG_ROW_LEN BLOCKS LAST_ANALYZED
---------- ----------- ---------- -------------
SQL> select blevel,leaf_blocks,distinct_keys,last_analyzed from user_indexes where table_name='XIAOGONGJIANG';--索引信息
BLEVEL LEAF_BLOCKS DISTINCT_KEYS LAST_ANALYZED
---------- ----------- ------------- -------------
从查询结果看出,表的行数,行长,占用的数据块数及最后的分析时间都是空。 索引的相关信息也没有,说明这个表和说因都没有被分析,如果此时有一条SQL 对表做查询,CBO 由于无法获取这些信息,很可能生成错误的执行计划。
查询执行计划
--执行sql,以便存到shared pool中
SQL>select /*+dynamic_sampling(xiaogongjiang 0) */ * from XIAOGONGJIANG where object_id>30;
.....省略输出
-- 查询出上个执行脚本对应的sql_id:5h16pnkvs0r5z
SQL>select * from v$sql a where a.SQL_TEXT like '%select /*+dynamic_sampling(xiaogongjiang 0) */ * from XIAOGONGJIANG where object_id>30%';
.....省略输出
--使用dbms_xplan.display_cursor查看sql真正的执行计划
SQL>select * from table(dbms_xplan.display_cursor('5h16pnkvs0r5z'));
导出html,查看如下

在Oracle 10g以后,如果一个表没有做分析,数据库将自动对它做动态采样分析,
所以这里采用hint的方式将动态采样的级别设置为0,即不使用动态采样。
分析后的数据及执行计划
第一种方式
SQL> analyze table xiaogongjiang compute statistics ;
Table analyzed
第二种方式(推荐)
SQL> exec dbms_stats.gather_table_stats(user,'xiaogongjiang');
PL/SQL procedure successfully completed
SQL> 第一个参数为用户,第二个参数为表
————————————————
通过DBMS_STATS包来分析,从9i 开始,Oracle 推荐使用DBMS_STATS包对表进行分析操作,因为DBMS_STATS 提供了更多的功能,以及灵活的操作方式。
SQL> select num_rows, avg_row_len, blocks, last_analyzed from user_tables where table_name = 'XIAOGONGJIANG';
NUM_ROWS AVG_ROW_LEN BLOCKS LAST_ANALYZED
---------- ----------- ---------- -------------
35183 27 152 2016-12-02 0:
SQL> select blevel,leaf_blocks,distinct_keys,last_analyzed from user_indexes where table_name='XIAOGONGJIANG';
BLEVEL LEAF_BLOCKS DISTINCT_KEYS LAST_ANALYZED
---------- ----------- ------------- -------------
1 77 35180 2016-12-02 0:
QL>select * from xiaogongjiang where object_id>30;
SQL>select * from v$sql a where a.SQL_TEXT like '%select * from xiaogongjiang where object_id>30%';
SQL>select * from table(dbms_xplan.display_cursor('gzspgs4btcpuf'));
从这个计划,我们看出CBO 估算出的结果是35153条记录,与实际的35183很近。 此时选择全表扫描更优。 通过这个例子,我们也看出了分析对执行计划的重要性
————————————————
原文链接:https://blog.csdn.net/yangshangwei/java/article/details/53428259
Oracle-表分析和索引分析解读的更多相关文章
- Oracle 表结构、索引以及分区信息查询
Oracle 表结构.索引以及分区信息查询 /* 获取表:*/ select table_name from user_tables; --当前用户的表 select table_name from ...
- 3、oracle表空间及索引操作
3.1.创建表空间和用户授权: 1.创建表空间: CREATE TABLESPACE <表空间名> LOGGING DATAFILE '<存放路径>' SIZE 50M AUT ...
- MySQL索引面试题分析(索引分析,典型题目案例)
[建表语句] create table test03( id int primary key not null auto_increment, c1 char(10), c2 char(10), c3 ...
- Oracle 表管理 约束 索引
表的约束与完整性: 1.实体完整性 主键唯一性 2.域完整性 不能向number中插入varchar 3.参照完整性 外键 以别的表的字段作为外键,再插入该表时所插入外键的值必须在被参照表中该字段有那 ...
- 转 关于oracle 分区表 表空间以及索引的总结
关于oracle的表空间,分区表,以及索引的总结关键字: oracle, 表空间, 分区表, 索引 上周第一次做数据库测试碰到了很多问题特此总结: 表空间: Oracle的UNDOTBS01.DBF文 ...
- oracle表分析
analyze table tablename compute statistics; analyze index indexname compute statistics; 对于使用CBO很有好处, ...
- Oracle 表分析
ANALYZE TABLE SeikyuTbl COMPUTE Statistics FOR TABLE FOR ALL COLUMNS FOR ALL INDEXES ; 一.优化器的优化方式 Or ...
- oracle表分区、表分析及oracle数据泵文件导入导出开心版
1.先说oracle表分区是什么吧,这样吧我们来举个桃子,栗子太小,我们就不举了,我们来举个桃子. 你有500万份文件,你要把他存在磁盘上,好嘛,我们就一个文件夹,500万分文件在那儿杵着,我们想找到 ...
- oracle表分区、表分析及oracle数据泵文件导入导出
1.先说oracle表分区是什么吧 你有500万份文件,你要把他存在磁盘上,好嘛,我们就一个文件夹,500万分文件在那儿杵着,我们想找到要的那个打开,嘿嘿,我们得找到什么时候. 这时候,有个人告诉你, ...
- 优化、分析Mysql表读写、索引等操作的sql语句效率优化问题
为什么要优化: 随着实际项目的启动,数据库经过一段时间的运行,最初的数据库设置,会与实际数据库运行性能会有一些差异,这时我们 就需要做一个优化调整. 数据库优化这个课题较大,可分为四大类: >主 ...
随机推荐
- CF Pinely Round 4
https://codeforces.com/contest/1991 \(-122=2019\) D \(1,3,4,6\) 构成团,所以答案下界为 \(4\) 按模 \(4\) 染色.同色的二进制 ...
- 1分钟掌握变速效果,让你的视频快慢自如----蓝松视频编辑SDK
2. 变速调整默认速度是1X就是正常播放速度,可以通过调节滑块,实现视频中的慢镜头动作 3.只需一行代码设置播放速度/** 视频的播放速度; 范围是 0.1---10.0 默认1.0; 正 ...
- 题解:AT_arc116_b [ARC116B] Products of Min-Max
在题库里面乱翻,就翻到了. 因为在这道题里面子序列不需要考虑元素顺序,所以原序列无论是什么顺序都不会影响答案. 所以先把元素按照从大到小的顺序排列,然后考虑每个元素的贡献. 在当前序列中,对于元素 \ ...
- GitHub Copilot 典型使用场景实践
大家好,我是Edison. 近期我们一直在使用GitHub Copilot协助开发编码工作,总结了一些实际场景的用法,可能在目前网络中很多的博客中都没有提及到,本文一一分享给你. 简介:你的结对编程伙 ...
- JavaScript – CommonJS
前言 既然写了 JavaScript – ES Module, 也就顺便些 CommonJS 呗, 建议先看 ES Module 那篇. 参考 Youtube – Require vs Import ...
- CSS & JS Effect – Image 倒影框
效果 Step1: HTML 结构 <div class="image"> <img src="./images/img-2.png" /&g ...
- SuperMap iServer8C证书过期如何解决
说明:该问题是SuperMap iServer8.0.2和8.1.0版本云许可模块问题,需要手动更新云许可HTTPS证书,可以升级到官网8.1.1/9D/10i等方式进行解决 针对无法升级或者老项目维 ...
- win10安装linux的gcc
mysy2下载gcc 过程比较艰苦,2024年秋冬讲课,被linux毒打了3天 pacman -S mingw-w64-ucrt-x86_64-gcc 这个一次成功,不行继续接大招 实在不行安装 ...
- webgl和canvas的区别
webgl和canvas的区别 WebGL和Canvas的主要区别在于它们的渲染方式.功能复杂性.以及编程难度.12 渲染方式:Canvas使用2D渲染上下文来绘制图形和图像,基于像素的绘图系统, ...
- dotnet定义扩展方法
// 扩展方法 // 1.创建静态类静态方法 2. 在静态方法中参数中使用 this 关键字指定需要扩展的类 // 密封类 不能直接继承,通过扩展方法,拿到父类的属性和方法进行扩展补充