[20170612]FOR ALL COLUMNS SIZE repeat(12c).txt
[20170612]FOR ALL COLUMNS SIZE repeat(12c).txt
--//昨天看了https://jonathanlewis.wordpress.com/2017/06/01/histogram-upgrade-2/,提到了直方图的问题,
--//特别是FOR ALL COLUMNS SIZE repeat引起的问题,在一些特殊情况要注意.
1.环境:
SCOTT@test01p> @ ver1
PORT_STRING VERSION BANNER CON_ID
------------------------------ -------------- ---------------------------------------------------------------------------- ------
IBMPC/WIN_NT64-9.1.0 12.1.0.1.0 Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production 0
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@test01p> exec dbms_stats.Gather_table_stats(ownname => user, tabname => 'T',method_opt => 'FOR ALL COLUMNS ');
PL/SQL procedure successfully completed.
SCOTT@test01p> SELECT flag, COUNT(*) FROM t GROUP BY flag;
F COUNT(*)
- ----------
d 2
a 20000
select * from DBA_TAB_COL_STATISTICS where owner=user and table_name='T' and column_name='FLAG';
Record View
As of: 2017/6/12 20:38:56
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 20:37:55
SAMPLE_SIZE: 20002
GLOBAL_STATS: YES
USER_STATS: NO
NOTES:
AVG_COL_LEN: 2
HISTOGRAM: FREQUENCY
SCOPE: SHARED
--//建立了直方图.bucket=2.
SCOTT@test01p> set numw 36
SCOTT@test01p> select * from USER_TAB_HISTOGRAMS where column_name='FLAG';
TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_A ENDPOINT_ACTUAL_VALU ENDPOINT_REPEAT_COUNT SCOPE
---------- ----------- --------------- ------------------------------------ ---------- -------------------- --------------------- -------
T FLAG 20000 503652795277878000000000000000000000 0 SHARED
T FLAG 20002 519229685853483000000000000000000000 0 SHARED
--//如果应用模式发生变化,加入了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@test01p> 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.
--//加入No_Invalidate => false,主要使执行计划能马上使用新的统计信息.
select * from DBA_TAB_COL_STATISTICS where owner=user and table_name='T' and column_name='FLAG';
Record View
As of: 2017/6/12 20:42:29
OWNER: SCOTT
TABLE_NAME: T
COLUMN_NAME: FLAG
NUM_DISTINCT: 4
LOW_VALUE: 61
HIGH_VALUE: 64
DENSITY: 0.25
NUM_NULLS: 0
NUM_BUCKETS: 2
LAST_ANALYZED: 2017/6/12 20:42:01
SAMPLE_SIZE: 5463
GLOBAL_STATS: YES
USER_STATS: NO
NOTES:
AVG_COL_LEN: 2
HISTOGRAM: HYBRID
SCOPE: SHARED
--//因为bucket桶没有变化,直方图变成了HYBRID.
SCOTT@test01p> select * from USER_TAB_HISTOGRAMS where table_name='T' and column_name='FLAG';
TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_A ENDPOINT_ACTUAL_VALU ENDPOINT_REPEAT_COUNT SCOPE
---------- ----------- --------------- ------------------------------------ ---------- -------------------- --------------------- -------
T FLAG 2760 503652795277878000000000000000000000 2760 SHARED
T FLAG 5463 519229685853483000000000000000000000 1 SHARED
SCOTT@test01p> alter session set statistics_level=all;
Session altered.
SCOTT@test01p> SELECT flag, COUNT(*) FROM t GROUP BY flag order by 1;
F COUNT(*)
- ---------
a 20000
b 20000
c 2
d 2
SCOTT@test01p> select * from t where flag='c';
ID PAD F
----- -------------------- -
40003 cccccccccccccccccccc c
40004 cccccccccccccccccccc c
SCOTT@test01p> @ 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 | 205 |
|* 1 | TABLE ACCESS FULL| T | 1 | 6598 | 180K| 68 (0)| 00:00:01 | 2 |00:00:00.01 | 205 |
--------------------------------------------------------------------------------------------------------------------
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 存在很大的差距,正是业务模式发生了变化,导致method_opt => 'FOR ALL COLUMNS size repeat'存在问题.
--//而这个问题在11G是不存在的,在使用method_opt => 'FOR ALL COLUMNS size repeat',会增加bucket的数量.
--//如果应用不存在这样的问题,估计关系不大.
--//简单的使用如下命令可以确定,"可能"有问题的直方图.
SELECT *
FROM DBA_TAB_COL_STATISTICS
WHERE owner = USER
AND table_name = 'T'
AND num_distinct < 255
AND histogram NOT LIKE '%FREQUENCY%';
Record View
As of: 2017/6/12 20:46:36
OWNER: SCOTT
TABLE_NAME: T
COLUMN_NAME: FLAG
NUM_DISTINCT: 4
LOW_VALUE: 61
HIGH_VALUE: 64
DENSITY: 0.25
NUM_NULLS: 0
NUM_BUCKETS: 2
LAST_ANALYZED: 2017/6/12 20:42:01
SAMPLE_SIZE: 5463
GLOBAL_STATS: YES
USER_STATS: NO
NOTES:
AVG_COL_LEN: 2
HISTOGRAM: HYBRID
SCOPE: SHARED
--//如果不指定repeat.
SCOTT@test01p> exec dbms_stats.Gather_table_stats(ownname => user, tabname => 'T',method_opt => 'FOR ALL COLUMNS ',No_Invalidate => false);
PL/SQL procedure successfully completed.
SCOTT@test01p> select * from USER_TAB_HISTOGRAMS where table_name='T' and column_name='FLAG';
TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_A ENDPOINT_ACTUAL_VALU ENDPOINT_REPEAT_COUNT SCOPE
---------- -------------------- --------------- ------------------------------------ ---------- -------------------- --------------------- -------
T FLAG 20000 503652795277878000000000000000000000 0 SHARED
T FLAG 40000 508845092136413000000000000000000000 0 SHARED
T FLAG 40002 514037388994948000000000000000000000 0 SHARED
T FLAG 40004 519229685853483000000000000000000000 0 SHARED
--//分析使用No_Invalidate => false,这样重新执行会重新分析.
select * from DBA_TAB_COL_STATISTICS where owner=user and table_name='T' and column_name='FLAG';
Record View
As of: 2017/6/12 20:49:27
OWNER: SCOTT
TABLE_NAME: T
COLUMN_NAME: FLAG
NUM_DISTINCT: 4
LOW_VALUE: 61
HIGH_VALUE: 64
DENSITY: 0.0000124987501249875
NUM_NULLS: 0
NUM_BUCKETS: 4
LAST_ANALYZED: 2017/6/12 20:47:21
SAMPLE_SIZE: 40004
GLOBAL_STATS: YES
USER_STATS: NO
NOTES:
AVG_COL_LEN: 2
HISTOGRAM: FREQUENCY
SCOPE: SHARED
--//这样建立的直方图=FREQUENCY.
SCOTT@test01p> select * from t where flag='c';
ID PAD F
----- -------------------- -
40003 cccccccccccccccccccc c
40004 cccccccccccccccccccc c
SCOTT@test01p> @ 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 | 205 |
|* 1 | TABLE ACCESS FULL| T | 1 | 2 | 56 | 68 (0)| 00:00:01 | 2 |00:00:00.01 | 205 |
--------------------------------------------------------------------------------------------------------------------
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')
--//这样就ok了.
--//对于这样的情况最佳的方式手工设置分析方式
BEGIN
dbms_stats.Set_table_prefs(user, 'T', 'METHOD_OPT'=>'FOR ALL COLUMNS SIZE 1, FOR COLUMNS SIZE AUTO flag');
END;
/
--//避免这个问题. 总之12c要注意分析方法METHOD_OPT'=>'FOR ALL COLUMNS SIZE repeat'带来的问题.
--//特别是一些应用模式发生变化的情况.而11g前面的测试不存在这个问题.
[20170612]FOR ALL COLUMNS SIZE repeat(12c).txt的更多相关文章
- [20170612]FOR ALL COLUMNS SIZE repeat(11g).txt
[20170612]FOR ALL COLUMNS SIZE repeat(11g).txt --//昨天看了https://jonathanlewis.wordpress.com/2017/06/0 ...
- [20180319]直接路径读特例12c.txt
[20180319]直接路径读特例12c.txt --//昨天的测试突然想起以前遇到的直接路径读特例,在12c重复测试看看. 1.环境:SCOTT@test01p> @ ver1 PORT_ST ...
- [20190524]DISABLE TABLE LOCK(12c).txt
[20190524]DISABLE TABLE LOCK(12c).txt --//如果禁止table lock时,一些ddl操作会被禁止.但是我有点吃惊的是增加字段不受限制.--//链接:http: ...
- [20180828]exadata--豆腐渣系统的保护神.txt
[20180828]exadata--豆腐渣系统的保护神.txt --//昨天看awr报表发现如下,时间8-9点报表,这个时间病房业务很少,主要门诊的业务: 1.awr报表情况:Top 10 Fore ...
- [20180118]tstats的问题.txt
[20180118]tstats的问题.txt --//关于使用tstats收集处理统计信息,可以看链接http://blog.itpub.net/267265/viewspace-1987839/ ...
- oracle exp(expdp)数据迁移(生产环境,进行数据对比校验)
前言:客户需要迁移XX 库 ZJJJ用户(迁移到其他数据库),由于业务复杂,客户都弄不清楚里面有哪些业务系统,为保持数据一致性,需要停止业务软件,中间件,杀掉oracle进程. 一.迁移数据倒出部分= ...
- Oracle Tuning (Oracle 性能调整)的一些总结
Oracle Tuning (Oracle 性能调整)的一些总结 Oracle Tuning (Oracle 性能调整)的一些总结关于Oracle的性能调整,一般包括两个方面,一是指Oracle数据库 ...
- 基于Oracle的SQL优化(崔华著)-学习笔记
201704171025 01. 列rows记录的就是执行计划中每一个执行步骤所对应的Cardinality的值 列Cost(%CPU)记录的就是执行计划中的每一个执行步骤对应的成本 02. Comp ...
- 【重磅干货】看了此文,Oracle SQL优化文章不必再看!
目录 SQL优化的本质 SQL优化Road Map 2.1 制定SQL优化目标 2.2 检查执行计划 2.3 检查统计信息 2.4 检查高效访问结构 2.5 检查影响优化器的参数 2.6 SQL语句编 ...
随机推荐
- Spring Boot (五)Spring Data JPA 操作 MySQL 8
一.Spring Data JPA 介绍 JPA(Java Persistence API)Java持久化API,是 Java 持久化的标准规范,Hibernate是持久化规范的技术实现,而Sprin ...
- Java——类和对象
前言 Java语言是一种面向对象的语言.面向对象的思想是在七十年代的时候由IBM的SmallTalk语言最先推广.那什么是面向对象呢?面向对象指的是一种开发模式.早期的计算机编程使用的是面向过程的 ...
- datatables 配套bootstrap样式使用小结(2) ajax篇
距离上一篇有点时间了,周末做了伴郎参加了一个土豪同学的婚礼. 上一篇是介绍一下基本的用法,基本的原理是取出所有的数据,然后调用$.datatables(option)方法格式化,这种方法显然不太科学, ...
- SpringMVC学习(三)———— springmvc的数据校验的实现
一.什么是数据校验? 这个比较好理解,就是用来验证客户输入的数据是否合法,比如客户登录时,用户名不能为空,或者不能超出指定长度等要求,这就叫做数据校验. 数据校验分为客户端校验和服务端校验 客户端校验 ...
- Perl的子程序
子程序(subroutine) perl中的子程序其实就是自定义函数.它使用sub关键字开头,表示声明一个子程序 子程序名称有独立的名称空间,不会和其它名称冲突 Perl中的子程序中可以定义.引用.修 ...
- 基于SpringMVC+Spring+MyBatis实现秒杀系统【客户端交互】
前言 该篇主要实现客户端和服务的交互.在第一篇概况里我已经贴出了业务场景的交互图片. 客户端交互主要放在seckill.js里来实现.页面展现基于jsp+jstl来实现. 准备工作 1.配置web.x ...
- MyBatis学习总结(一)——ORM概要与MyBatis快速起步
程序员应该将核心关注点放在业务上,而不应该将时间过多的浪费在CRUD中,多数的ORM框架都把增加.修改与删除做得非常不错了,然后数据库中查询无疑是使用频次最高.复杂度大.与性能密切相关的操作,我们希望 ...
- 从零开始学安全(九)●OSI参考模型分层
主要分为7层和网络7层模型一样 物理层主要传输数据比特流 可以理解信号 数据链路层 逻辑层 像是交换机 网络层 又交换机发送到路由器 应用层 应用通信
- ProtoBuf使用指南(C++)
ProtoBuf使用指南(C++) Created: Mar 12, 2019 6:47 PM Last Edited Time: Mar 22, 2019 1:51 PM 1.安装部署 去官网(gi ...
- Mac下写博客工具ecto相关资料
下载地址: https://www.macupdate.com/app/mac/8918/ecto 相关注册码: http://www.cnblogs.com/yssgyw/p/3284501.htm ...