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语句效率优化问题
为什么要优化: 随着实际项目的启动,数据库经过一段时间的运行,最初的数据库设置,会与实际数据库运行性能会有一些差异,这时我们 就需要做一个优化调整. 数据库优化这个课题较大,可分为四大类: >主 ...
随机推荐
- 新一代监控神器Prometheus+Grafana介绍及使用
一.介绍 1.什么是Prometheus? 普罗米修斯是一个开源的系统监控及报警工具,在2016年加入了 Cloud Native Computing Foundation,是继Kubernetes之 ...
- 从cmake解决clion编译生成的可执行文件(.exe)不可执行的问题
我这里没有显示报错,是直接闪退的情况,但是网上搜索的时候大多数是有报错弹窗的,运行报错提示为无法链接动态库.如下图: ![原图来自CSDN@LJY_kt11 一句话说清楚 原因是使用CLion编译的程 ...
- 关于.NET在中国为什么工资低的分析
引言 近年来,随着软件开发行业的蓬勃发展,越来越多的编程语言和框架进入了市场,成为了不同类型软件开发项目的首选工具.然而,在中国的开发者社区中,.NET 开发人员的工资水平相比其他技术栈,如 Java ...
- C# SAPX调用用户控件方法
//获得用户控件 Type pageType = ucMoneyList1.GetType(); //用户控件方法名 MethodI ...
- Angular 18+ 高级教程 – NgModule
前言 NgModule 在 Angular v14 以前是一门必修课.然而,自 Angular v14 推出 Standalone Component 以后,它的地位变得越来越边缘化了. 本教程从开篇 ...
- CSS & JS Effect – FAQ Accordion & Slide Down
效果 参考: Youtube – Responsive FAQ accordion dropdown | HTML and CSS Tutorial 几个难点 1. 如何 align left for ...
- QQ或者微信可以放昵称的超好看的符号
☪︎⋆ ✯ ⛈ •ᴗ• •ᴥ• ◔.̮◔ ᕱ ᕱ ⸝⸝· ᴥ ·⸝⸝ ʕ·͡ˑ·ཻʔ ʕ•̫͡•ོʔ ˃̣̣̥᷄⌓˂̣̣̥᷅ °꒰'ꀾ'꒱° ⋆ᶿ̵᷄ ˒̼ ᶿ̵᷅⋆ ˙ϖ˙ ⚝ ︎ .˗ˏˋ♡ˎˊ˗ ...
- 服务器Linux的一些常用命令,收藏备用!
在Linux服务器的管理和维护过程中,掌握一些常用的命令是非常必要的.这些命令不仅可以帮助你更好地了解和控制系统,还能提高工作效率,减少错误发生的概率.本文将详细介绍一些在Linux服务器上常用的命令 ...
- Pytorch常用的交叉熵损失函数CrossEntropyLoss()详解
本篇借鉴了这篇文章,如果有兴趣,大家可以看看:https://blog.csdn.net/geter_CS/article/details/84857220 1.交叉熵:交叉熵主要是用来判定实际的输出 ...
- Java日期时间API系列27-----Jdk8中java.time包中的新的日期时间API类,使用xk-time工具类创建日历应用,自定义节假日,工作日和打印日历表。
1.日历相关类 1.1 日历类 CalendarWrapper package com.xkzhangsan.time.calendar; import java.io.Serializable; i ...