[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的更多相关文章

  1. [20170612]FOR ALL COLUMNS SIZE repeat(11g).txt

    [20170612]FOR ALL COLUMNS SIZE repeat(11g).txt --//昨天看了https://jonathanlewis.wordpress.com/2017/06/0 ...

  2. [20180319]直接路径读特例12c.txt

    [20180319]直接路径读特例12c.txt --//昨天的测试突然想起以前遇到的直接路径读特例,在12c重复测试看看. 1.环境:SCOTT@test01p> @ ver1 PORT_ST ...

  3. [20190524]DISABLE TABLE LOCK(12c).txt

    [20190524]DISABLE TABLE LOCK(12c).txt --//如果禁止table lock时,一些ddl操作会被禁止.但是我有点吃惊的是增加字段不受限制.--//链接:http: ...

  4. [20180828]exadata--豆腐渣系统的保护神.txt

    [20180828]exadata--豆腐渣系统的保护神.txt --//昨天看awr报表发现如下,时间8-9点报表,这个时间病房业务很少,主要门诊的业务: 1.awr报表情况:Top 10 Fore ...

  5. [20180118]tstats的问题.txt

    [20180118]tstats的问题.txt --//关于使用tstats收集处理统计信息,可以看链接http://blog.itpub.net/267265/viewspace-1987839/ ...

  6. oracle exp(expdp)数据迁移(生产环境,进行数据对比校验)

    前言:客户需要迁移XX 库 ZJJJ用户(迁移到其他数据库),由于业务复杂,客户都弄不清楚里面有哪些业务系统,为保持数据一致性,需要停止业务软件,中间件,杀掉oracle进程. 一.迁移数据倒出部分= ...

  7. Oracle Tuning (Oracle 性能调整)的一些总结

    Oracle Tuning (Oracle 性能调整)的一些总结 Oracle Tuning (Oracle 性能调整)的一些总结关于Oracle的性能调整,一般包括两个方面,一是指Oracle数据库 ...

  8. 基于Oracle的SQL优化(崔华著)-学习笔记

    201704171025 01. 列rows记录的就是执行计划中每一个执行步骤所对应的Cardinality的值 列Cost(%CPU)记录的就是执行计划中的每一个执行步骤对应的成本 02. Comp ...

  9. 【重磅干货】看了此文,Oracle SQL优化文章不必再看!

    目录 SQL优化的本质 SQL优化Road Map 2.1 制定SQL优化目标 2.2 检查执行计划 2.3 检查统计信息 2.4 检查高效访问结构 2.5 检查影响优化器的参数 2.6 SQL语句编 ...

随机推荐

  1. 项目ITP(二) 二维码 拿起你的手机装一装,扫一扫 【每日一搏】

    前言 系列文章:[传送门] 五一,期待的两天假期.我的生日,happy. [吐槽] 学校真恶心,半月前让我给他搞个东西,md,课题不加人.后来又来求,说钱(钱,咱不需要:我猜也不多).到现在,又来了, ...

  2. ES6躬行记(6)——Symbol

    本节将会重点分析ES6引入的第6种基本类型:Symbol(符号).符号可以像字符串那样作为对象的属性名,只是它有唯一性的特点,可以避免属性名之间的冲突. 一.创建 符号没有字面量形式,只能通过Symb ...

  3. ARM的体系结构与编程系列博客——ARM体系版本

    ARM体系版本前言 很多人都知道,ARM有许多版本,口中最长说的就是ARM7\ARM9\ARM11,诚然,这个的确是ARM处理器的版本,但绝对不是ARM的版本,其实ARM到迄今为止经历了6代版本,随着 ...

  4. AngularJs_自定义注入对象_笔记1

    A-自定义控件示例: 我的自定义控件文件为:angular-seagull2-common.js (function (window, angular) { 'use strict'; $urlPro ...

  5. [转]Docker基础-使用Dockerfile创建镜像

    本文转自:https://www.cnblogs.com/jie-fang/p/7927643.html 1.基本结构 Dockerfile由一行行命令语句组成,并支持以#开头的注释行.例如: # T ...

  6. [转]Docker php extensions gd

    本文转自:https://docs.docker.com/samples/library/php/ How to use this image Create a Dockerfile in your ...

  7. java时间类Date、Calendar及用法

    对于时间类,这篇主要说明各种现实情况下如何取值,怎么定向取值,得到自己想要的时间参数.在java中时间类主要有Date.Calendar,暂时只介绍 java.util.*下的时间类,对于java.s ...

  8. webpack4 系列教程(十四):Clean Plugin and Watch Mode

    作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十四):Clean Plugin and Watch Mode>原文地址.更欢迎 ...

  9. SaaS技术栈的走势

    本地部署时代 在软件还是“本地部署(on-premise)”的时候,SaaS的版图被大型玩家把持着,几乎所有的垂直领域(营销.支持.销售.人力)都被微软.SAP等大公司的解决方案占据.那时候的用户并没 ...

  10. HTML5标签选择,图文混排使用dl dt dd

    图文混排,可以使用 dl dt dd(dd 和 dt 是同级,不可以嵌套,没有先后顺序) 1,上面红色部分是标题,可以使用h1里面包含一个span标签,样式一样,所以两个可以一起写. 2,上面黑色部分 ...