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"