[20170612]FOR ALL COLUMNS SIZE repeat(11g).txt
[20170612]FOR ALL COLUMNS SIZE repeat(11g).txt
--//昨天看了https://jonathanlewis.wordpress.com/2017/06/01/histogram-upgrade-2/,提到了直方图的问题,
--//特别是FOR ALL COLUMNS SIZE repeat引起的问题,在一些特殊情况要注意.
1.环境:
SCOTT@book> @ &r/ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
create table t (id number,pad varchar2(20),flag varchar2(1));
insert into t select rownum,lpad('a',20,'a') ,'a' from dual connect by level<=2e4;
insert into t select rownum+2e4,lpad('d',20,'d') ,'d' from dual connect by level<=2;
commit ;
SCOTT@book> SELECT flag, COUNT(*) FROM t GROUP BY flag;
F COUNT(*)
- ----------
d 2
a 20000
SCOTT@book> exec dbms_stats.Gather_table_stats(ownname => user, tabname => 'T',method_opt => 'FOR ALL COLUMNS ');
PL/SQL procedure successfully completed.
select * from DBA_TAB_COL_STATISTICS where owner=user and table_name='T' and column_name='FLAG';
Record View
As of: 2017/6/12 9:35:03
OWNER: SCOTT
TABLE_NAME: T
COLUMN_NAME: FLAG
NUM_DISTINCT: 2
LOW_VALUE: 61
HIGH_VALUE: 64
DENSITY: 0.000024997500249975
NUM_NULLS: 0
NUM_BUCKETS: 2
LAST_ANALYZED: 2017/6/12 9:33:35
SAMPLE_SIZE: 20002
GLOBAL_STATS: YES
USER_STATS: NO
AVG_COL_LEN: 2
HISTOGRAM: FREQUENCY
--//建立了直方图.
SCOTT@book> set numw 36
SCOTT@book> select * from USER_TAB_HISTOGRAMS where column_name='FLAG';
TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_A
---------- ----------- --------------- ------------------------------------ ----------
T FLAG 20000 503652795277878000000000000000000000
T FLAG 20002 519229685853483000000000000000000000
--//如果应用模式发生变化,加入了2种值.
insert into t select rownum+2e4+2,lpad('b',20,'b') ,'b' from dual connect by level<=2e4;
insert into t select rownum+4e4+2,lpad('c',20,'c') ,'c' from dual connect by level<=2;
commit ;
SCOTT@book> exec dbms_stats.Gather_table_stats(ownname => user, tabname => 'T',method_opt => 'FOR ALL COLUMNS size repeat',no_invalidate=> false);
PL/SQL procedure successfully completed.
select * from DBA_TAB_COL_STATISTICS where owner=user and table_name='T' and column_name='FLAG';
Record View
As of: 2017/6/12 9:38:59
OWNER: SCOTT
TABLE_NAME: T
COLUMN_NAME: FLAG
NUM_DISTINCT: 4
LOW_VALUE: 61
HIGH_VALUE: 64
DENSITY: 0.0000126552145963607
NUM_NULLS: 0
NUM_BUCKETS: 4
LAST_ANALYZED: 2017/6/12 9:38:10
SAMPLE_SIZE: 5432
GLOBAL_STATS: YES
USER_STATS: NO
AVG_COL_LEN: 2
HISTOGRAM: FREQUENCY
--//因为bucket桶变成了4个,直方图依旧是FREQUENCY.
SCOTT@book> select * from USER_TAB_HISTOGRAMS where table_name='T' and column_name='FLAG';
TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_A
---------- ----------- --------------- ------------------------------------ ----------
T FLAG 2775 503652795277878000000000000000000000
T FLAG 5430 508845092136413000000000000000000000
T FLAG 5431 514037388994948000000000000000000000
T FLAG 5432 519229685853483000000000000000000000
SCOTT@book> alter session set statistics_level=all;
Session altered.
SCOTT@test01p> select * from t where flag='c';
ID PAD F
----- -------------------- -
40003 cccccccccccccccccccc c
40004 cccccccccccccccccccc c
SCOTT@book> @ &r/dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID g3pmd0h5vnw5r, child number 0
-------------------------------------
select * from t where flag='c'
Plan hash value: 1601196873
--------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers |
--------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | | 68 (100)| | 2 |00:00:00.01 | 204 |
|* 1 | TABLE ACCESS FULL| T | 1 | 7 | 196 | 68 (0)| 00:00:01 | 2 |00:00:00.01 | 204 |
--------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1 / T@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("FLAG"='c')
23 rows selected.
--//可以发现E-rows 与 A-rows 差距不大,而12c的情况就不同了.12c如果使用method_opt => 'FOR ALL COLUMNS size repeat'后,
--//bucket=2,直方图变成了混合型直方图.也就是如果升级12c,要注意分析方法method_opt => 'FOR ALL COLUMNS size repeat'带来的问题.
--//再写有点长,另外写看12c的测试.
--//当然如果数据模型没有发生变化,问题可以不考虑.
转载于:https://www.cnblogs.com/lfree/p/6994999.html
[20170612]FOR ALL COLUMNS SIZE repeat(11g).txt相关推荐
- 续:跨平台版本迁移之 XTTS 方案操作指南
作者 | 罗贵林: 云和恩墨技术工程师,具有8年以上的 Oracle 数据库工作经验,曾任职于大型的国家电信.省级财政.省级公安的维护,性能调优等.精通 Oracle 数据库管理,调优,问题诊断.擅长 ...
- 基于Oracle的SQL优化(崔华著)-学习笔记
201704171025 01. 列rows记录的就是执行计划中每一个执行步骤所对应的Cardinality的值 列Cost(%CPU)记录的就是执行计划中的每一个执行步骤对应的成本 02. Comp ...
- Oracle-使用切片删除的方式清理非分区表中的超巨数据
文章目录 概述 Step1:rowid_chunk.sql Step2:文件上传到Oracle主机用户,执行@rowid_chunk.sql Step2.1: 上传脚本 Step2.2: 连接数据库, ...
- Oracle收集统计信息
Oracle收集统计信息 优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN: 列统计: --列中唯一值的数量(NDV ...
- 详解Oracle统计信息
优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN: 列统计: --列中唯一值的数量(NDV),NULL值的数量,数据 ...
- 收集oracle统计信息
原文地址为: 收集oracle统计信息 优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN: 列统计: --列中唯一值 ...
- oracle 数据库执行 alter table rename to 后表及索引的统计信息变化
os: centos 7.4 db: oracle 11.2.0.4 版本 # cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) ...
- ORACLE 中dbms_stats的使用
dbms_stats能良好地估计统计数据(尤其是针对较大的分区表),并能获得更好的统计结果,最终制定出速度更快的SQL执行计划. execdbms_stats.gather_schema_stats( ...
- DBMS_STATS.GATHER_TABLE_STATS详解
由于Oracle的优化器是CBO,所以对象的统计数据对执行计划的生成至关重要! 作用:DBMS_STATS.GATHER_TABLE_STATS统计表,列,索引的统计信息(默认参数下是对表进行直方图信 ...
最新文章
- ORB-SLAM2代码/流程详解
- 作为一个新人,怎样学习嵌入式Linux?
- it程序员刷题 面试 中文网站收集
- C# DirectX 开发2 - 定义一个矩阵和赋值
- 移植 Python 量化交易 TA-Lib 库到函数计算
- android 客户端bks,Keytools Https双向认证(Android通用)
- JavaScript学习(五十六)—寄生式继承(临时构造器的使用)
- win10-linux双系统安装教程
- 电气器件系列三十三:步进电机驱动器
- java自动生成一年中工作日和休息日(公休日及假期国家法定假日)
- D触发器实现JK触发器
- 微信小程序社区疫情防控+后台管理系统|前后分离VUE
- 书友汇德天-创作不停,学习不止(十字交叉线画法)
- 装配作业指导书是什么?装配作业指导书主要包括哪些内容?
- Linux 时间校准与同步
- Android 无标题 全屏设置
- html代码制作的个人简历
- Linux通过脚本实现远程自动备份
- OSChina 周六乱弹 ——泡妞指南
- 软件国际化—语言代码表