ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 11g统计信息方面增强(三)

11g统计信息方面增强(三)

原创 Linux操作系统 作者:yangtingkun 时间:2010-10-31 23:41:49 0 删除 编辑

在11g中,Oracle在统计信息方面进行了进一步的增强。

这篇介绍统计信息比较。

11g统计信息方面增强(一):http://yangtingkun.itpub.net/post/468/507713

11g统计信息方面增强(二):http://yangtingkun.itpub.net/post/468/507859

 

 

前两篇介绍PENDING统计信息,这篇继续利用上一篇文章中的例子,来介绍11g新增的统计信息比较功能。

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

会话已更改。

SQL> SELECT TABLE_NAME, NUM_ROWS, LAST_ANALYZED
  2  FROM USER_TABLES
  3  WHERE TABLE_NAME = 'T';

TABLE_NAME                       NUM_ROWS LAST_ANALYZED
------------------------------ ---------- -------------------
T                                      26 2010-10-31 06:42:55

SQL> SELECT TABLE_NAME, STATS_UPDATE_TIME
  2  FROM USER_TAB_STATS_HISTORY
  3  WHERE TABLE_NAME = 'T';

TABLE_NAME                     STATS_UPDATE_TIME
------------------------------ ----------------------------------------------------------
T                              31-10
月-10 06.42.55.047571 上午 +08:00

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T')

PL/SQL 过程已成功完成。

SQL> SELECT TABLE_NAME, NUM_ROWS, LAST_ANALYZED
  2  FROM USER_TAB_PENDING_STATS
  3  WHERE TABLE_NAME = 'T';

TABLE_NAME                       NUM_ROWS LAST_ANALYZED
------------------------------ ---------- -------------------
T                                   69446 2010-11-01 04:59:49

除了前一篇介绍的验证PENDING统计信息的方法,还可以利用11g提供的DIFF_TABLE_STATS_IN_PENDING函数来返回PENDING统计信息与数据字典统计信息的差异。

SQL> SET LONG 100000
SQL> SELECT * FROM TABLE(DBMS_STATS.DIFF_TABLE_STATS_IN_PENDING(USER, 'T'));

REPORT                                                                           MAXDIFFPCT
-------------------------------------------------------------------------------- ----------
###############################################################################

STATISTICS DIFFERENCE REPORT FOR:
.................................

TABLE         : T
OWNER         : TEST
SOURCE A      : Current Statistics in dictionary
SOURCE B      : Pending Statistics
PCTTHRESHOLD  : 10
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

TABLE / (SUB)PARTITION STATISTICS DIFFERENCE:
.............................................

OBJECTNAME                  TYP SRC ROWS       BLOCKS     ROWLEN     SAMPSIZE
...............................................................................

T                           T   A   26         5          3          26
                                B   69446      54         5          69446
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

COLUMN STATISTICS DIFFERENCE:
.............................

COLUMN_NAME     SRC NDV     DENSITY    HIST NULLS   LEN  MIN   MAX   SAMPSIZ
...............................................................................

ID              A   26      .038461538 NO   0       3    C102  C11B  26
                B   69446   .000014399 NO   0       5    C102  C3075 69446
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

INDEX / (SUB)PARTITION STATISTICS DIFFERENCE:
.............................................

OBJECTNAME      TYP SRC ROWS    LEAFBLK DISTKEY LF/KY DB/KY CLF     LVL SAMPSIZ
...............................................................................


                                 INDEX: IND_T_ID
                                 ...............

IND_T_ID        I   A   26      1       26      1     1     1       0   26
                    B   69446   69      69446   1     1     53      NUL 69446
###############################################################################

函数返回的结果很友好,二者的差别一目了然。这个函数的输入函数可以指定时间戳,如果采用默认值,则使用数据字典中使用的统计信息,如果指定时间戳,则可以利用HISTORY中的统计信息与PENDING统计信息进行比较。

下面看一下HISTORY统计信息与当前统计信息进行比较:

SQL> EXEC DBMS_STATS.PUBLISH_PENDING_STATS(USER, 'T')

PL/SQL 过程已成功完成。

SQL> SELECT TABLE_NAME, STATS_UPDATE_TIME
  2  FROM USER_TAB_STATS_HISTORY
  3  WHERE TABLE_NAME = 'T';

TABLE_NAME                     STATS_UPDATE_TIME
------------------------------ ---------------------------------------------------------------------------
T                              31-10
月-10 06.42.55.047571 上午 +08:00
T                              01-11
月-10 05.19.35.035969 上午 +08:00

SQL> SELECT * FROM TABLE(                                                 
  2  DBMS_STATS.DIFF_TABLE_STATS_IN_HISTORY(     
  3  USER,
  4  'T',
  5  TO_TIMESTAMP_TZ('2010-10-31 06:42:55.047571 +08:00', 'YYYY-MM-DD HH24:MI:SS.FF +TZH:TZM')));

REPORT                                                                           MAXDIFFPCT
-------------------------------------------------------------------------------- ----------
###############################################################################

STATISTICS DIFFERENCE REPORT FOR:
.................................

TABLE         : T
OWNER         : TEST
SOURCE A      : Statistics as of 31-10
月-10 06.42.55.047571 上午 +08:00
SOURCE B      : Current Statistics in dictionary
PCTTHRESHOLD  : 10
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

TABLE / (SUB)PARTITION STATISTICS DIFFERENCE:
.............................................

OBJECTNAME                  TYP SRC ROWS       BLOCKS     ROWLEN     SAMPSIZE
...............................................................................

T                           T   A   26         5          3          26
                                B   69446      54         5          69446
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

COLUMN STATISTICS DIFFERENCE:
.............................

COLUMN_NAME     SRC NDV     DENSITY    HIST NULLS   LEN  MIN   MAX   SAMPSIZ
...............................................................................

ID              A   NO_STATS
                B   69446   .000014399 NO   0       5    C102  C3075 69446
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

INDEX / (SUB)PARTITION STATISTICS DIFFERENCE:
.............................................

OBJECTNAME      TYP SRC ROWS    LEAFBLK DISTKEY LF/KY DB/KY CLF     LVL SAMPSIZ
...............................................................................


                                 INDEX: IND_T_ID
                                 ...............

IND_T_ID        I   A   26      1       26      1     1     1       0   26
                    B   69446   69      69446   1     1     53      1   69446
###############################################################################

这个函数有两个时间戳输入参数,如果仅指定一个时间戳,则是指定时间点的统计信息与当前数据字典中的统计信息进行比较,如果输入两个时间戳,则是HISTORY中两个时间点的统计信息进行比较。

除了与PENDING统计信息、历史统计信息比较之外,还可以与用户导出、导入的统计信息进行比较:

SQL> SELECT COUNT(*) FROM T_STAT;

  COUNT(*)
----------
         3

SQL> SELECT * FROM TABLE(DBMS_STATS.DIFF_TABLE_STATS_IN_STATTAB(USER, 'T', 'T_STAT'));

REPORT                                                                           MAXDIFFPCT
-------------------------------------------------------------------------------- ----------
###############################################################################

STATISTICS DIFFERENCE REPORT FOR:
.................................

TABLE         : T
OWNER         : TEST
SOURCE A      : User statistics table T_STAT
              : Statid     :
              : Owner      : TEST
SOURCE B      : Current Statistics in dictionary
PCTTHRESHOLD  : 10
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


NO DIFFERENCE IN TABLE / (SUB)PARTITION STATISTICS
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


NO DIFFERENCE IN COLUMN STATISTICS
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

INDEX / (SUB)PARTITION STATISTICS DIFFERENCE:
.............................................

OBJECTNAME      TYP SRC ROWS    LEAFBLK DISTKEY LF/KY DB/KY CLF     LVL SAMPSIZ
...............................................................................


                                 INDEX: IND_T_ID
                                 ...............

IND_T_ID        I   A   69446   69      69446   1     1     53      NUL 69446
                    B   69446   69      69446   1     1     53      1   69446
###############################################################################

当第二个STATTAB输入参数为空时,统计表内的统计信息于数据字典中的统计信息进行比较,这也是默认设置。利用这个函数,还可以比较两张统计表中的统计信息,或者一张统计表中不同统计ID对应的统计,方法大同小异,这里就不再赘述了。

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-677126/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1964
  • 访问量
    11076556