V$INDEX_USAGE_INFO中找不到监控索引数据的尴尬经历
在一个Oracle 12.1实例中,想监控一个表的索引使用情况,在system用户下执行了下面脚本以及输出的监控索引脚本后,发现V$OBJECT_USAGE下一直没有对应的记录(在system用户下查询)
SELECT
'ALTER INDEX '||OWNER||'.'||INDEX_NAME||' MONITORING USAGE;'
FROM
DBA_INDEXES
WHERE
INDEX_TYPE != 'LOB' AND OWNER NOT IN ('SYS', 'SYSMAN', 'SYSTEM', 'MDSYS', 'WMSYS', 'TSMSYS', 'DBSNMP', 'OUTLN')
AND OWNER=UPPER('&OWNER')
AND TABLE_NAME=UPPER('&TABLE_NAME')
;
许久没有使用这个功能了,还以为我遇到bug了,一通折腾下来,居然是时间太久了,自己也忘记了一些细节:V$OBJECT_USAGE只能查看/显示当前用户下被监控的索引使用统计信息。即使sys、system用户也不能查看其它用户的数据。这个跟视图V$OBJECT_USAGE的定义有关,如下所示,它在查询条件中过滤了记录集,只显示当前用户下的记录。
create or replace view V$OBJECT_USAGE
(INDEX_NAME,
TABLE_NAME,
MONITORING,
USED,
START_MONITORING,
END_MONITORING)
as
select io.name, t.name,
decode(bitand(i.flags, 65536), 0, 'NO', 'YES'),
decode(bitand(ou.flags, 1), 0, 'NO', 'YES'),
ou.start_monitoring,
ou.end_monitoring
from sys.obj$ io, sys.obj$ t, sys.ind$ i, sys.object_usage ou
where io.owner# = userenv('SCHEMAID')
and i.obj# = ou.obj#
and io.obj# = ou.obj#
and t.obj# = i.bo#
/
从Oracle 12.2开始,Oracle默认会监控索引的使用情况,而不用特意去设置监控索引使用情况,我们只需从DBA_INDEX_USAGE查看索引的使用情况,而自己的忘性也越来越大,真是廉颇老矣尚能饭否。悲催啊!