概述
当表没有做分析的时候,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-表分析和索引分析解读的更多相关文章

  1. Oracle 表结构、索引以及分区信息查询

    Oracle 表结构.索引以及分区信息查询 /* 获取表:*/ select table_name from user_tables; --当前用户的表 select table_name from ...

  2. 3、oracle表空间及索引操作

    3.1.创建表空间和用户授权: 1.创建表空间: CREATE TABLESPACE <表空间名> LOGGING DATAFILE '<存放路径>' SIZE 50M AUT ...

  3. MySQL索引面试题分析(索引分析,典型题目案例)

    [建表语句] create table test03( id int primary key not null auto_increment, c1 char(10), c2 char(10), c3 ...

  4. Oracle 表管理 约束 索引

    表的约束与完整性: 1.实体完整性 主键唯一性 2.域完整性 不能向number中插入varchar 3.参照完整性 外键 以别的表的字段作为外键,再插入该表时所插入外键的值必须在被参照表中该字段有那 ...

  5. 转 关于oracle 分区表 表空间以及索引的总结

    关于oracle的表空间,分区表,以及索引的总结关键字: oracle, 表空间, 分区表, 索引 上周第一次做数据库测试碰到了很多问题特此总结: 表空间: Oracle的UNDOTBS01.DBF文 ...

  6. oracle表分析

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

  7. Oracle 表分析

    ANALYZE TABLE SeikyuTbl COMPUTE Statistics FOR TABLE FOR ALL COLUMNS FOR ALL INDEXES ; 一.优化器的优化方式 Or ...

  8. oracle表分区、表分析及oracle数据泵文件导入导出开心版

    1.先说oracle表分区是什么吧,这样吧我们来举个桃子,栗子太小,我们就不举了,我们来举个桃子. 你有500万份文件,你要把他存在磁盘上,好嘛,我们就一个文件夹,500万分文件在那儿杵着,我们想找到 ...

  9. oracle表分区、表分析及oracle数据泵文件导入导出

    1.先说oracle表分区是什么吧 你有500万份文件,你要把他存在磁盘上,好嘛,我们就一个文件夹,500万分文件在那儿杵着,我们想找到要的那个打开,嘿嘿,我们得找到什么时候. 这时候,有个人告诉你, ...

  10. 优化、分析Mysql表读写、索引等操作的sql语句效率优化问题

    为什么要优化: 随着实际项目的启动,数据库经过一段时间的运行,最初的数据库设置,会与实际数据库运行性能会有一些差异,这时我们 就需要做一个优化调整. 数据库优化这个课题较大,可分为四大类: >主 ...

随机推荐

  1. [考试记录] 2024.7.15 csp-s模拟赛4

    2024.7.15 csp-s模拟赛4 T1 传送带 题面翻译 有一个长度为 \(n\) 的一维网格.网格的第 \(i\) 个单元格包含字符 \(s_i\) ,是"<"或&q ...

  2. 9组-Beta冲刺-3/5

    一.基本情况(15分) 队名:不行就摆了吧 组长博客:9组-Beta冲刺-3/5 GitHub链接:https://github.com/miaohengming/studynote/tree/mai ...

  3. 流体饱和多孔介质的本构关系 + Föppl-von Kármán 方程

    向有液体的多孔介质上施加应力,应力一部分分布到骨架上,一部分分布到孔隙流体上.骨架上的应力会导致变形,所以被称为 "有效应力".这里考虑拉伸应力为正,有效应力原理写为 \[\sig ...

  4. 修改 Ubuntu 文件夹为英文

    如果你在安装 Ubuntu 时,语言选了中文,那么系统自动创建的文件夹也会是中文(下载.图片 等).有时这会造成不便.可以通过以下命令将文件夹改为英文: LANG=C LC_ALL=C xdg-use ...

  5. Python if __name__ == "__main__" 解释

    一种机制,允许脚本以不同的方式运行,这取决于作为独立的程序执行还是作为模块被其他脚本导入.这种机制就是 if __name == "__main__" 其作用是控制某些代码块只在该 ...

  6. Xmind 8思维导图(含补丁)

    Xmind 8思维导图(含补丁) 什么是思维导图? 如何下载Xmind8 Xmind 8软件简单使用 获取Xmind 8 补丁 什么是思维导图? 数据结构.电路模拟等学习路线,老师都有叫画思维导图,那 ...

  7. C#自定义控件—流动管道

    C#用户控件之流动管道 如何绘制一个动态的流动管道(FlowPipe)? 分两步绘制 定义属性: 画布重绘: 主要技能: 管道的绘制(渐变色矩形) /// <summary> /// 画渐 ...

  8. WebShell流量特征检测_蚁剑篇

    80后用菜刀,90后用蚁剑,95后用冰蝎和哥斯拉,以phpshell连接为例,本文主要是对这四款经典的webshell管理工具进行流量分析和检测. 什么是一句话木马? 1.定义 顾名思义就是执行恶意指 ...

  9. 闲的蛋疼整理了一下Dockerfile的命令和参数备查

    Dockerfile 主要指令及参数: 指令 主要参数 作用 用法示例 FROM <image>[:<tag>] [AS <name>] 指定基础镜像 FROM u ...

  10. mysql后台导入sql文件-设定字符集

    需求描述:有一个user_info.sql 的文件里面都是插入user_info表的insert语句数据,数据量500M,要求快速插入mysql的数据库中. 解决方法: 1.利用客户端工具加载文件插入 ...