ITPub博客

首页 > 数据库 > Oracle > [20211104]12cR2 new index usage tracking.txt

[20211104]12cR2 new index usage tracking.txt

原创 Oracle 作者:lfree 时间:2021-11-04 15:28:23 0 删除 编辑

[20211104]12cR2 new index usage tracking.txt

--//Oracle12.2引入了索引使用跟踪,以取代以前的索引监控。而不是只判断是否使用了索引(DBA_OBJECT_USAGE.used),使用跟踪提供
--//了一个量化的索引使用统计数据,如访问次数、每次访问返回的行数。
--//11g使用V$OBJECT_USAGE视图,我估计很少人使用。

--//有两个视图V$INDEX_USAGE_INFO 和DBA_INDEX_USAGE 以及3个隐藏参数,用于报告和控制索引使用情况的跟踪:

--//V$INDEX_USAGE_INFO
--//跟踪自上次刷新以来的索引使用情况。每15分钟冲洗一次。每次刷新后,ACTIVE_ELEM_COUNT被重置为0,LAST_FLUSH_TIME被更新为
--//当前时间。

--//DBA_INDEX_USAGE
--//将对象刷新到磁盘后,显示对象级索引使用情况。
--//在生产系统简单探究看看:

1.环境:
SYS@127.0.0.1:xxxxx/ddhhh> @ prxx
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 19.0.0.0.0
BANNER                        : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.9.0.0.0
BANNER_LEGACY                 : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

SYS@127.0.0.1:xxxxx/ddhhh> @ hide _iut_
NAME                      DESCRIPTION                              DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE ISSES ISSYS_MOD
------------------------- ---------------------------------------- ------------- ------------- ------------ ----- ---------
_iut_enable               Control Index usage tracking             TRUE          TRUE          TRUE         FALSE IMMEDIATE
_iut_max_entries          Maximum Index entries to be tracked      TRUE          30000         30000        FALSE IMMEDIATE
_iut_stat_collection_type Specify Index usage stat collection type TRUE          SAMPLED       SAMPLED      TRUE  IMMEDIATE
--//缺省_iut_enable=true,也就是缺省索引监控是打开的。
--//如果需要获得准确的统计可以设置_iut_stat_collection_type=ALL.

SYS@127.0.0.1:xxxxx/ddhhh> @ bg m00
ADDR                 PID SPID   PROGRAM
---------------- ------- ------ --------------------------
00000002A0E005A8       9 20287  oracle@oda1 (M001)
00000002C0D72868      62 17664  oracle@oda1 (M000)
00000002C0D7BE78      97 20291  oracle@oda1 (M002)
00000002D0EE4FD0     311 62640  oracle@oda1 (M003)
--//感觉oracle设计不好,后台进程没有简单的说明。

$ cat bgx.sql
select s.program, s.module, s.action, s.sid, p.pid, p.spid
from v$session s, v$process p
where s.paddr=p.addr and S.PROGRAM like upper('%&1%')
order by s.program;

SYS@127.0.0.1:xxxxx/ddhhh> @ bgx m00
PROGRAM                    MODULE       ACTION                          SID     PID SPID
-------------------------- ------------ ----------------------------- ----- ------- ------
oracle@oda1 (M000)         MMON_SLAVE   Intensive AutoTask Dispatcher   608      62 17664
oracle@oda1 (M001)         MMON_SLAVE   Automatic Report Flush         2719       9 20287
oracle@oda1 (M002)         MMON_SLAVE   KDILM background EXEcution     5139      97 20291
oracle@oda1 (M003)         MMON_SLAVE   KDILM background CLeaNup       3330     311 62640
--//猜测后台进程M000 完成这项工作。

SYS@127.0.0.1:xxxxx/ddhhh> select * from v$index_usage_info
  2  @ prxx
==============================
INDEX_STATS_ENABLED           : 1
INDEX_STATS_COLLECTION_TYPE   : 1
ACTIVE_ELEM_COUNT             : 121
ALLOC_ELEM_COUNT              : 210
MAX_ELEM_COUNT                : 30000
FLUSH_COUNT                   : 52
TOTAL_FLUSH_DURATION          : 850315
LAST_FLUSH_TIME               : 2021-11-04 11:08:06.424
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
STATUS_MSG                    :
CON_ID                        : 0
PL/SQL procedure successfully completed.
--//等15分钟看看。
SYS@127.0.0.1:xxxxx/ddhhh> select * from v$index_usage_info
  2  @ prxx
==============================
INDEX_STATS_ENABLED           : 1
INDEX_STATS_COLLECTION_TYPE   : 1
ACTIVE_ELEM_COUNT             : 92
ALLOC_ELEM_COUNT              : 210
MAX_ELEM_COUNT                : 30000
FLUSH_COUNT                   : 53
TOTAL_FLUSH_DURATION          : 881731
LAST_FLUSH_TIME               : 2021-11-04 11:23:09.270
STATUS_MSG                    :
CON_ID                        : 0
PL/SQL procedure successfully completed.
--//基本可以确定15分钟刷新1次。

select * from dba_index_usage;
--//结果不输出了,以后可以利用它确定索引是否有效,当然也存在一些问题。
SYS@127.0.0.1:xxxxx/ddhhh> @desc dba_index_usage
Name                            Null?    Type
------------------------------- -------- ----------------------------
OBJECT_ID                       NOT NULL NUMBER
NAME                            NOT NULL VARCHAR2(128)
OWNER                           NOT NULL VARCHAR2(128)
TOTAL_ACCESS_COUNT                       NUMBER
TOTAL_EXEC_COUNT                         NUMBER
TOTAL_ROWS_RETURNED                      NUMBER
BUCKET_0_ACCESS_COUNT                    NUMBER
BUCKET_1_ACCESS_COUNT                    NUMBER
BUCKET_2_10_ACCESS_COUNT                 NUMBER
BUCKET_2_10_ROWS_RETURNED                NUMBER
BUCKET_11_100_ACCESS_COUNT               NUMBER
BUCKET_11_100_ROWS_RETURNED              NUMBER
BUCKET_101_1000_ACCESS_COUNT             NUMBER
BUCKET_101_1000_ROWS_RETURNED            NUMBER
BUCKET_1000_PLUS_ACCESS_COUNT            NUMBER
BUCKET_1000_PLUS_ROWS_RETURNED           NUMBER
LAST_USED                                DATE
--//还建立几个bucket分别确定访问以及返回的次数,这样可以简单确定索引是否有效。
--//查看视图DBA_INDEX_USAGE定义,可以确定写入wri$_index_usage表。
CREATE OR REPLACE FORCE VIEW SYS.DBA_INDEX_USAGE
(OBJECT_ID, NAME, OWNER, TOTAL_ACCESS_COUNT, TOTAL_EXEC_COUNT,
 TOTAL_ROWS_RETURNED, BUCKET_0_ACCESS_COUNT, BUCKET_1_ACCESS_COUNT, BUCKET_2_10_ACCESS_COUNT, BUCKET_2_10_ROWS_RETURNED,
 BUCKET_11_100_ACCESS_COUNT, BUCKET_11_100_ROWS_RETURNED, BUCKET_101_1000_ACCESS_COUNT, BUCKET_101_1000_ROWS_RETURNED, BUCKET_1000_PLUS_ACCESS_COUNT,
 BUCKET_1000_PLUS_ROWS_RETURNED, LAST_USED)
BEQUEATH DEFINER
AS
(SELECT o.obj#
       ,o.name
       ,u.name
       ,iu.total_access_count
       ,iu.total_exec_count
       ,iu.total_rows_returned
       ,iu.bucket_0_access_count
       ,iu.bucket_1_access_count
       ,iu.bucket_2_10_access_count
       ,iu.bucket_2_10_rows_returned
       ,iu.bucket_11_100_access_count
       ,iu.bucket_11_100_rows_returned
       ,iu.bucket_101_1000_access_count
       ,iu.bucket_101_1000_rows_returned
       ,iu.bucket_1000_plus_access_count
       ,iu.bucket_1000_plus_rows_returned
       ,iu.last_used
   FROM sys.wri$_index_usage iu, sys.obj$ o, sys.user$ u
  WHERE (o.obj# = iu.obj# AND o.owner# = u.user#));
CREATE OR REPLACE PUBLIC SYNONYM DBA_INDEX_USAGE FOR SYS.DBA_INDEX_USAGE;
GRANT SELECT ON SYS.DBA_INDEX_USAGE TO SELECT_CATALOG_ROLE;

--//扫描共享池可以发现执行DML语句如下:
--//5cu0x10yu88sw
MERGE INTO sys.wri$_index_usage iu
     USING DUAL
        ON (iu.obj# = :objn)
WHEN MATCHED
THEN
   UPDATE SET
      iu.total_access_count = iu.total_access_count + :ns
     ,iu.total_rows_returned = iu.total_rows_returned + :rr
     ,iu.total_exec_count = iu.total_exec_count + :ne
     ,iu.bucket_0_access_count = iu.bucket_0_access_count + :nsh0
     ,iu.bucket_1_access_count = iu.bucket_1_access_count + :nsh1
     ,iu.bucket_2_10_access_count = iu.bucket_2_10_access_count + :nsh2_10
     ,iu.bucket_2_10_rows_returned = iu.bucket_2_10_rows_returned + :nrh2_10
     ,iu.bucket_11_100_access_count =
         iu.bucket_11_100_access_count + :nsh11_100
     ,iu.bucket_11_100_rows_returned =
         iu.bucket_11_100_rows_returned + :nrh11_100
     ,iu.bucket_101_1000_access_count =
         iu.bucket_101_1000_access_count + :nsh101_1000
     ,iu.bucket_101_1000_rows_returned =
         iu.bucket_101_1000_rows_returned + :nrh101_1000
     ,iu.bucket_1000_plus_access_count =
         iu.bucket_1000_plus_access_count + :nsh1000plus
     ,iu.bucket_1000_plus_rows_returned =
         iu.bucket_1000_plus_rows_returned + :nrh1000plus
     ,last_used = SYSDATE
WHEN NOT MATCHED
THEN
   INSERT
              (
                 iu.obj#
                ,iu.total_access_count
                ,iu.total_rows_returned
                ,iu.total_exec_count
                ,iu.bucket_0_access_count
                ,iu.bucket_1_access_count
                ,iu.bucket_2_10_access_count
                ,iu.bucket_2_10_rows_returned
                ,iu.bucket_11_100_access_count
                ,iu.bucket_11_100_rows_returned
                ,iu.bucket_101_1000_access_count
                ,iu.bucket_101_1000_rows_returned
                ,iu.bucket_1000_plus_access_count
                ,iu.bucket_1000_plus_rows_returned
                ,iu.last_used
              )
       VALUES
              (
                 :objn
                , :ns
                , :rr
                , :ne
                , :nsh0
                , :nsh1
                , :nsh2_10
                , :nrh2_10
                , :nsh11_100
                , :nrh11_100
                , :nsh101_1000
                , :nrh101_1000
                , :nsh1000plus
                , :nrh1000plus
                ,SYSDATE
              )

SYS@127.0.0.1:xxxxx/ddhhh> @ ashtop session_id,PROGRAM,module,action,event sql_id='5cu0x10yu88sw' trunc(sysdate)-100 sysdate
    Total
  Seconds     AAS %This   SESSION_ID PROGRAM                    MODULE       ACTION                                EVENT FIRST_SEEN          LAST_SEEN
--------- ------- ------- ---------- -------------------------- ------------ ------------------------------------- ----- ------------------- -------------------
        1      .0  100% |        913 oracle@oda2 (M002)         MMON_SLAVE   Index usage tracking statistics flush       2021-11-04 04:21:02 2021-11-04 04:21:02
--//在实例2抓取到1次等待时间,噢前面说明是M002执行的而且在实例2上执行的。
--//在实例2执行如下:
SYS@ddhhh> @ bgx m00
PROGRAM                    MODULE       ACTION                                 SID     PID SPID
-------------------------- ------------ ------------------------------------- ---- ------- ------
oracle@oda2 (M000)         MMON_SLAVE   Monitor FRA Space                      608      62 17135
oracle@oda2 (M001)         MMON_SLAVE   Index usage tracking statistics flush  612     122 20809
oracle@oda2 (M002)         MMON_SLAVE   Auto-Flush Slave Action                913     123 20815
oracle@oda2 (M003)         MMON_SLAVE   Automatic Report Flush                1216     124 20821
--//sid=913可以对上。
--//在实例1执行如下:
SYS@127.0.0.1:xxxxx/ddhhh> @ bgx m00
PROGRAM                    MODULE       ACTION                          SID     PID SPID
-------------------------- ------------ ----------------------------- ----- ------- ------
oracle@oda1 (M000)         MMON_SLAVE   Intensive AutoTask Dispatcher   608      62 17664
oracle@oda1 (M001)         MMON_SLAVE   Automatic Report Flush         2719       9 20287
oracle@oda1 (M002)         MMON_SLAVE   KDILM background EXEcution     5139      97 20291
oracle@oda1 (M003)         MMON_SLAVE   KDILM background CLeaNup       3330     311 62640
--//oracle rac 两台机器还分工,M00N后台进程两边的任务还不同。
--//链接:blog.dbi-services.com/12cr2-new-index-usage-tracking/给出一些讨论,比如分析索引,可能导致统计增加以及主外键因
--//素导致因素给特别注意,自己应该引起注意。


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

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969784