[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. Gradle安装使用以及基本操作

    这两天看到越来越多的在接触Gradle,然后发现我之前没有做过记录,而且之后下个月的一些有关SpringBoot的东西也需要用到,所以这里就来记录一下,方便以后使用. 简单介绍 Gradle是一个好用 ...

  2. Buffer的工作方式

    1.Buffer的工作方式 前面<java NIO的工作方式>介绍了Selector检测到通信信道I/O有数据传输时,通过select()方法取得SocketChannel,将数据读取或写 ...

  3. Linux软件包管理之源码包、脚本安装包

    目录 1.源码包和RPM包的区别 RPM包和源码包默认安装位置: 由于安装位置不同带来的影响 2.源码包安装 ①.安装准备 ②.安装注意事项 ③.安装源码包 3.源码包卸载 4.脚本安装包 5.总结 ...

  4. php使用cURL上传图片

    上传文件和POST非常相似,都是通过表单采取POST方法提交的. 先新建一个接收文件的页面upload.php: var_dump($_POST); var_dump($_FILES); 再建立一个发 ...

  5. 给HTML页面指定元素添加属性,添加父元素

    给HTML页面指定元素添加属性,添加父元素 下面拿一个给富文本中所有的图片增加layer弹窗效果. 思路: 给富文本父元素设置属性. 获取父元素里所有的img   此处用到querySelectorA ...

  6. 翻译:select into outfile(已提交到MariaDB官方手册)

    本文为mariadb官方手册:SELECT INTO OUTFILE的译文. 原文:https://mariadb.com/kb/en/select-into-outfile/ 我提交到MariaDB ...

  7. Linux命令-基本操作和软件安装

    配置JDK环境:JAVA_HOME:D:\software\JDK1.7Path:%JAVA_HOME%\bin;%JAVA_HOME%\lib; ls(查看当前目录下的文件及文件夹)sh initN ...

  8. C#集合。

    集合命名空间: using system.collections. 非泛型集合 using system.collections.Generic.  泛型集合 为什么要用集合: 1.数组一旦声明长度就 ...

  9. 金三银四招聘季,这些BAT以及独角兽互联网公司官方招聘网站值得关注。(个人梳理备用:附BAT以及独角兽公司官方招聘网址)

    金三银四是一年当中的招聘最旺盛的时期,即招聘高峰期,在这个期间内有非常多名企巨头公司的放出大量的岗位信息.以博主几年的工作经验来看,在这期间找到称心如意的工作的几率大大提升,对于很多程序员来说,薪水高 ...

  10. eclipse使用svn

    主干(trunk).分支(branch ).标记(tag) 用法示例 + 图解   以svn为例,git的master相当于trunk,dev分支相当于branches --------------- ...