V$INDEX_USAGE_INFO中找不到监控索引数据的尴尬经历
2023-05-10 22:08 潇湘隐者 阅读(120) 评论(0) 编辑 收藏 举报在一个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查看索引的使用情况,而自己的忘性也越来越大,真是廉颇老矣尚能饭否。悲催啊!

【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
2021-05-10 pip3安装库时报超时问题小结
2019-05-10 SQL Server一个特殊的阻塞案例分析2
2018-05-10 MySQL的变量分类总结
2016-05-10 Linux服务开机自启动设置