oracle method_opt,统计量收集Method_Opt参数使用(下)
上篇中,我们介绍了dbms_stats的重要参数method_opt的使用和默认参数。本篇中我们继续来讨论这个参数的作用。
4、method_opt的格式块
从官方介绍上看,method_opt格式是一个字符串结构,有如下结构:
For all [indexed | hidden] columns size xxx
或者
For columns size xxx column
在含义中,字符串包括两个层面:一个是要确定要收集数据表哪些列的统计量,另一个是要确定收集直方图的时候设置多少个bucket。
目前实践场景中,第一个层面一般都是选择收集所有的统计量。也就是使用all columns选项。早期CBO和一些特殊场景下,可以考虑使用indexed和hidden取值,但是并不推荐。
All indexed columns表示只是将出现在数据表索引中的数据列收集统计量。非索引列是不会收集统计量。同时,只有索引列才会创建直方图。
我们给实验数据表T添加索引对象。
SQL> create index idx_t_owner on t(owner);
Index created
SQL> create index idx_t_status on t(status);
Index created
SQL> create index idx_t_id on t(object_id);
Index created
--删除原有的统计量
SQL> exec dbms_stats.delete_table_stats(user,'T');
PL/SQL procedure successfully completed
SQL> exec dbms_stats.gather_table_stats(user,'T',method_opt => 'for all indexed columns size 254');
PL/SQL procedure successfully completed
SQL> select column_name, num_buckets, histogram from dba_tab_col_statistics where wner='SYS' and table_name='T';
COLUMN_NAMENUM_BUCKETS HISTOGRAM
------------------------------ ----------- ---------------
OWNER27 FREQUENCY
OBJECT_ID254 HEIGHT BALANCED
STATUS2 FREQUENCY
Indexed columns方法显然是反映了Oracle在列统计量收集问题上的一种想法。但是,这种思考是欠考虑的。因为我们不能保证where条件后面出现的所有列均是索引列,而且其他操作,如group by等也是有列因素在其中的。
Hidden columns选项的范围更小,只有那些virtual columns才会被收集统计量。Hidden columns统计量可以帮助提高虚拟列的成本评估。
Size部分表示的是生成直方图的时候,选择的bucket个数。Size参数可以有如下控制值:
Auto:10g之后的默认选项。根据列使用的情况和数据分布情况进行直方图的创建。根据我们在上篇中的讨论,auto情况下要依据col_usage$基础表和数据的倾斜情况来判断。
整数:直接指定bucket的个数。在11g版本中,bucket个数在1-254之间。如果选择直接指定bucket个数的方法,我们可以找到的是一个最大bucket数量。具体真实的个数要根据收集过程中的实际情况而定。如上面的代码片段,我们要求生成254 bucket的直方图,但是只有离散度最好的object_id生成了高度均衡的254 bucket直方图,其他都比较少。应该说,实际收集过程中的bucket个数,与distinct值和直方图类型相关。
Skewonly:根据数据列的分布情况来判断直方图的生成。
SQL> exec dbms_stats.delete_table_stats(user,'T');
PL/SQL procedure successfully completed
SQL> exec dbms_stats.gather_table_stats(user,'T',method_opt => 'for all columns sizeskewonly');
PL/SQL procedure successfully completed
SQL> select column_name, num_buckets, histogram from dba_tab_col_statistics where wner='SYS' and table_name='T';
COLUMN_NAMENUM_BUCKETS HISTOGRAM
------------------------------ ----------- ---------------
OWNER29 FREQUENCY
OBJECT_NAME254 HEIGHT BALANCED
SUBOBJECT_NAME110 FREQUENCY
OBJECT_ID1 NONE
DATA_OBJECT_ID254 HEIGHT BALANCED
OBJECT_TYPE35 FREQUENCY
CREATED254 HEIGHT BALANCED
LAST_DDL_TIME254 HEIGHT BALANCED
TIMESTAMP254 HEIGHT BALANCED
STATUS2 FREQUENCY
TEMPORARY2 FREQUENCY
GENERATED2 FREQUENCY
SECONDARY2 FREQUENCY
NAMESPACE17 FREQUENCY
EDITION_NAME0 NONE
15 rows selected
从上面的结果看,如果使用skewonly选项,Oracle会去分析数据列的分布情况。如果数据呈现出偏移倾斜的情况,会去生成直方图。
Repeat:Oracle的统计量是一个累积的过程。使用repeat选项去收集哪些当前已经有统计量的列。
5、特定列的统计量收集
For all columns是收集所有的数据列,从格式上,method_opt还支持一种特定列统计量的收集格式。具体格式为for columns size xxx [column name]。
SQL> exec dbms_stats.delete_table_stats(user,'T');
PL/SQL procedure successfully completed
SQL> select column_name, num_buckets, histogram from dba_tab_col_statistics where wner='SYS' and table_name='T';
COLUMN_NAMENUM_BUCKETS HISTOGRAM
------------------------------ ----------- ---------------
SQL> exec dbms_stats.gather_table_stats(user,'T',method_opt => 'for columns size 10 owner');
PL/SQL procedure successfully completed
SQL> select column_name, num_buckets, histogram from dba_tab_col_statistics where wner='SYS' and table_name='T';
COLUMN_NAMENUM_BUCKETS HISTOGRAM
------------------------------ ----------- ---------------
OWNER10 HEIGHT BALANCED
这样的格式中,只给指定的列生成指定数量bucket的统计量。那么,如果需要收集多个列的统计量,可以按照两种格式进行指定。
SQL> exec dbms_stats.gather_table_stats(user,'T',method_opt => 'for columns size 10 owner for columns size 5 object_name');
PL/SQL procedure successfully completed
SQL> select column_name, num_buckets, histogram from dba_tab_col_statistics where wner='SYS' and table_name='T';
COLUMN_NAMENUM_BUCKETS HISTOGRAM
------------------------------ ----------- ---------------
OWNER10 HEIGHT BALANCED
OBJECT_NAME5 HEIGHT BALANCED
SQL> exec dbms_stats.delete_table_stats(user,'T');
PL/SQL procedure successfully completed
SQL> exec dbms_stats.gather_table_stats(user,'T',method_opt => 'for columns size 10 owner object_name object_id');
PL/SQL procedure successfully completed
SQL> select column_name, num_buckets, histogram from dba_tab_col_statistics where wner='SYS' and table_name='T';
COLUMN_NAMENUM_BUCKETS HISTOGRAM
------------------------------ ----------- ---------------
OWNER10 HEIGHT BALANCED
OBJECT_NAME10 HEIGHT BALANCED
OBJECT_ID10 HEIGHT BALANCED
6、拓展extended统计量收集
Oracle CBO优化器的统计量统计维度默认是单列。当SQL语句中出现多个条件列的时候,其估算的行数是不准确的。在目前的版本中,有两个方法来提高估算精确度,一个是采用动态采样Dynamic Sampling进行实时收集,另一个就是采用11g的拓展统计量Extended Statistic。
在之前的文章中,我们介绍过如何创建Extended统计量。我们使用method_opt,也可以进行拓展统计量收集。
--Sys用户下
SQL> exec dbms_stats.delete_table_stats(user,'T');
PL/SQL procedure successfully completed
SQL> exec dbms_stats.gather_table_stats(user,'T',method_opt => 'for columns size 10 (owner, object_type)');
begin dbms_stats.gather_table_stats(user,'T',method_opt => 'for columns size 10 (owner, object_type)'); end;
ORA-20000: Unable to create extension: not supported for SYS owned table
ORA-06512:在"SYS.DBMS_STATS", line 20337
ORA-06512:在"SYS.DBMS_STATS", line 20360
ORA-06512:在line 1
转换到scott普通用户下进行试验。
SQL> conn scott/tiger@wilson;
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as scott
SQL> drop table t purge;
Table dropped
SQL> create table t as select * from dba_objects;
Table created
SQL> exec dbms_stats.gather_table_stats(user,'T',method_opt => 'for columns size 10 (owner, object_type)');
PL/SQL procedure successfully completed
SQL> select column_name, num_buckets, histogram from dba_tab_col_statistics where wner='SCOTT' and table_name='T';
COLUMN_NAMENUM_BUCKETS HISTOGRAM
------------------------------ ----------- ---------------
SYS_STUXJ8K0YTS_5QD1O0PEA514IY10 HEIGHT BALANCED
7、结论
在诸多Oracle dbms_stats参数中,method_opt灵活性很高。使用好这个参数,可以帮助我们更好的进行精确化统计量定义,提高SQL执行效率。
oracle method_opt,统计量收集Method_Opt参数使用(下)相关推荐
- oracle按用户采集信息,oracle 11g 手动收集用户统计信息
oracle 11g 手动收集用户统计信息 2020-07-25 编程之家收集整理的这篇文章主要介绍了oracle 11g 手动收集用户统计信息,编程之家小编觉得挺不错的,现在分享给大家,也给大家做个 ...
- Oracle GI 日志收集工具 - TFA
1.TFA的目的: TFA是个11.2版本上推出的用来收集Grid Infrastructure/RAC环境下的诊断日志的工具,它可以用非常简单的命令协助用户收集RAC里的日志,以便进一步进行诊断:T ...
- 导出Windows服务器下的Oracle数据库并导入到Linux服务器下的Oracle数据库中
2019独角兽企业重金招聘Python工程师标准>>> 说明: 1.Windows Oracle数据库 操作系统:Windows Server 2008 R2 IP地址:192.16 ...
- oracle adjusting parallel,Oracle 并行相关的初始化参数
Oracle数据库并行操作,特别是在RAC环境,一定程度上能够提升数据库的性能,所以对相关的初始化参数的了解是必要的,这篇文章将根据实际的案例讨论Oracle数据库的部分并行参数. Oracle数据库 ...
- 【RAC】Oracle集群心跳及其参数misscount/disktimeout/reboottime
Oracle 集群心跳及其参数misscount/disktimeout/reboottime 在Oracle RAC中,可以从多个层次,多个不同的机制来检测RAC的健康状况,即可以通过心跳机制以及一 ...
- oracle spool 分隔符_sqlplus--spool命令参数详解
sqlplus--SPOOL参数详解 Spool是Oracle快速导出数据的工具,是sqlplus的指令,不是sql语法里的东西 一.Spool常用的设置 set arraysize 5000; / ...
- oracle solaris 内核 源码,Oracle和SUN Solaris内核参数
Oracle和SUN Solaris内核参数 2010-4-11文字大小:大中小 本文描画了Sun Solaris上运转Oracle数据库所须要配置的一些内核参数. 一些预备知识shared memo ...
- oracle imp 1403,Oracle中用exp/imp命令参数详解【转】
Oracle中用exp/imp命令参数详解 [用 exp 数 据 导 出]: 1 将数据库TEST完全导出,用户名system 密码manager 导出到D:daochu.dmp中 expsyste ...
- 事件参数对象下的几个属性 mouseenter与mouseover的区别
事件参数对象下的几个属性 <!DOCTYPE html> <html lang="en"> <head><meta charset=&qu ...
最新文章
- linux 系统调用 open函数使用
- 始于TensorFlow ,终于PyTorch
- 官方解读,谷歌“T5”模型,如何突破迁移学习局限,实现多基准测试SOTA
- python numpy数组转换成列表方法 object.tolist()函数
- Confluence 6 使用 Apache 和 mod_proxy 添加 SSL和其他
- postman进阶之Newman,从安装到使用到填坑,不废话
- R语言对用电负荷时间序列数据进行K-medoids聚类建模和GAM回归
- 类成员与方法访问控制从严
- main函数结束后的调用
- Android Gradle Task-中文
- git和github的基本使用
- 【渝粤教育】广东开放大学 计算机组成原理 形成性考核 (21)
- android studio for android learning (十七) Toast使用详解
- Element-UI el-table组件表格打印
- PLC控制系统设计的基本原则和主要内容
- Halcon仿射变换图片(旋转、缩放、平移)
- 对话「平衡车之父」:把Solowheel带回中国
- 关于mybatis整合spring时报java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/Trasactionwar
- windows驱动开发8:虚拟摄像头方案
- Elasticsearch入门教程(五):Elasticsearch查询(一)
热门文章
- win10下cmd ping不通虚拟机,xshell连不上虚拟机【如果实在想不出来原因,就看看吧】
- HadoopIO和javaIO的区别
- leetcode 509. 斐波那契数(Java版)
- 操作系统:第四章 文件管理2 - 磁盘管理,磁盘调度算法
- 数据库-DQL练习(附答案)
- cxf环境搭建与第一个项目
- 区块链技术指南笔记(二):区块链技术
- 洛谷——P1583 魔法照片
- C语言:L1-031 到底是不是太胖了 (10分)(解题报告)
- 14行代码AC_Break the Chocolate HDU-4112(数学推导+解析)