oracle

ヒストグラム取得の判断材料はsys.col_usage$にあります

sys.col_usage$を基にヒストグラム取得対象カラムが決まります

Oracle任せで列統計情報の取得を行った場合、sys.col_usage$(ディクショナリビュー)の値を元に取得対象カラムが決まります。sys.col_usage$にはかつて実行されたSQLのWHERE句に指定された条件が記録されているため、この情報を判断材料としています。この内容を確認するために専用のファンクションDBMS_STATS.REPORT_COL_USAGE()が用意されていますので今回はこれを使ってみました。

DBMS_STATS.REPORT_COL_USAGE()の利用

以下はSOONI.SYAINテーブルと、SOONI.TAB_INFテーブルに対してかつてどんな問い合わせがあったのか確認します。

set pages 1000
set loboffset 1
set long 80000
set longchunksize 2000
select DBMS_STATS.REPORT_COL_USAGE ('SOONI','SYAIN') from dual
;
利用例
SQL> set loboffset 1
SQL> set long 8000
SQL> set longchunksize 2000
SQL> select DBMS_STATS.REPORT_COL_USAGE ('SOONI','SYAIN') from dual
  2  ;

DBMS_STATS.REPORT_COL_USAGE('SOONI','SYAIN')
--------------------------------------------------------------------------------
LEGEND:
.......

EQ         : Used in single table EQuality predicate
RANGE      : Used in single table RANGE predicate
LIKE       : Used in single table LIKE predicate
NULL       : Used in single table is (not) NULL predicate
EQ_JOIN    : Used in EQuality JOIN predicate
NONEQ_JOIN : Used in NON EQuality JOIN predicate
FILTER     : Used in single table FILTER predicate
JOIN       : Used in JOIN predicate

DBMS_STATS.REPORT_COL_USAGE('SOONI','SYAIN')
--------------------------------------------------------------------------------
GROUP_BY   : Used in GROUP BY expression
...............................................................................

###############################################################################

COLUMN USAGE REPORT FOR SOONI.SYAIN
...................................

1. ID                                  : EQ
2. ROMAJI                              : EQ
###############################################################################

DBMS_STATS.REPORT_COL_USAGE('SOONI','SYAIN')
--------------------------------------------------------------------------------




SQL> select DBMS_STATS.REPORT_COL_USAGE ('SOONI','TAB_INF') from dual;

DBMS_STATS.REPORT_COL_USAGE('SOONI','TAB_INF')
--------------------------------------------------------------------------------
LEGEND:
.......

EQ         : Used in single table EQuality predicate
RANGE      : Used in single table RANGE predicate
LIKE       : Used in single table LIKE predicate
NULL       : Used in single table is (not) NULL predicate
EQ_JOIN    : Used in EQuality JOIN predicate
NONEQ_JOIN : Used in NON EQuality JOIN predicate
FILTER     : Used in single table FILTER predicate
JOIN       : Used in JOIN predicate

DBMS_STATS.REPORT_COL_USAGE('SOONI','TAB_INF')
--------------------------------------------------------------------------------
GROUP_BY   : Used in GROUP BY expression
...............................................................................

###############################################################################

COLUMN USAGE REPORT FOR SOONI.TAB_INF
.....................................

1. COLUMN_POSITION                     : EQ_JOIN
2. INDEX_NAME                          : EQ_JOIN
3. TABLE_NAME                          : EQ LIKE EQ_JOIN

DBMS_STATS.REPORT_COL_USAGE('SOONI','TAB_INF')
--------------------------------------------------------------------------------
4. TABLE_OWNER                         : EQ EQ_JOIN
###############################################################################




SQL>

sys.col_usage$への反映にはタイムラグがあります。直ぐにSQLで使った条件の反映をしたい場合、DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO() を実行すると良いです。

専用ファンクションを使わず直接sys.col_usage$を参照してみた結果が以下です

sys.col_usage$を直接表示
select 
 s.obj#
,u.name schema
,o.name tablename
,c.name colname
,s.intcol#
,s.equality_preds
,s.equijoin_preds
,s.nonequijoin_preds
,s.range_preds
,s.like_preds
,s.null_preds
from sys.col_usage$ s 
inner join sys.obj$ o   on s.obj#   = o.obj# 
inner join sys.user$ u  on o.owner# = u.user#
inner join sys.col$ c   on s.obj#   = c.obj#
and s.intcol# = c.intcol#
where u.name='SOONI'
and (o.NAME in ('SYAIN','TAB_INF'))
order by u.NAME,o.NAME,c.NAME
;
表示結果

         |          |          |                |       |  EQUALITY|  EQUIJOIN|NONEQUIJOIN|RANGE|          |
     OBJ#|SCHEMA    |TABLENAME |COLNAME         |INTCOL#|     PREDS|     PREDS|      PREDS|PREDS|LIKE_PREDS|NULL_PREDS
---------|----------|----------|----------------|-------|----------|----------|-----------|-----|----------|----------
   100305|SOONI     |SYAIN     |ID              |      1|         2|         0|          0|    0|         0|         0
   100305|SOONI     |SYAIN     |ROMAJI          |      3|         2|         0|          0|    0|         0|         0
   100721|SOONI     |TAB_INF   |COLUMN_POSITION |      6|         0|         5|          0|    0|         0|         0
   100721|SOONI     |TAB_INF   |INDEX_NAME      |      2|         0|         3|          0|    0|         0|         0
   100721|SOONI     |TAB_INF   |TABLE_NAME      |      4|         4|         5|          0|    0|         1|         0
   100721|SOONI     |TAB_INF   |TABLE_OWNER     |      3|         5|         5|          0|    0|         0|         0

SQL>
SQL*Plus表示用
set lin 200
col obj# for '99999999'
col schema for a8
col tablename for a10
col colname for a16
col INTCOL# FORMAT 990
col RANGE_PREDS FORMAT 990
set colsep '|'
COLUMN EQUALITY_PREDS HEADING "EQUALITY|PREDS"
COLUMN EQUIJOIN_PREDS HEADING "EQUIJOIN|PREDS"
COLUMN NONEQUIJOIN_PREDS HEADING "NONEQUIJOIN|PREDS"
COLUMN RANGE_PREDS HEADING "RANGE|PREDS"
スポンサーリンク