昨天用指令碼產生一堆索引 監控語句
select 'alter index '||index_name||' monitoring usage;'
from user_indexes;
alter index IX_BASE_PROUSER_USER monitoring usage;
alter index IX_BASE_PROUSER_LOWEX monitoring usage;
alter index IX_BASE_PROUSER_SOURCE monitoring usage;
alter index IX_BASESUCCPROUSE_ENDDATE monitoring usage;
alter index IX_BASE_PROUSER_YEARMONTH monitoring usage;
alter index IX_BASE_PROUSER_YEARWEEK monitoring usage;
alter index IX_BASE_PROUSER_PROID monitoring usage;
alter index IX_VIP_TRADEDETAIL_NAMEADDTIME monitoring usage;
然後在pl/sql developer 的 command 視窗執行成功
今天淩晨有15個過程在跑。上班後用SYS帳號查看
select * from V$OBJECT_USAGE
結果沒沒有記錄
為此專門寫個查詢去使用 索引 IX_VIP_TRADEDETAIL_NAMEADDTIME。可後果依舊沒有記錄。
最後從網上扣了這段代碼過來
select object_owner, object_name, options, count(*)
from v$sql_plan
where operation='INDEX'
and object_owner='BI'
group by object_owner, object_name, operation, options
order by count(*) desc;
原因:是用SYS帳號是看不到BI帳號的索引監控情況的
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#
注意到v$object_usage關鍵資訊來源於OBJECT_USAGE表.
另外我們可以注意一下,此處v$object_usage的查詢基於userenv('SCHEMAID')建立.
所以以不同使用者登入,你是無法看到其他使用者的索引監視資訊的,即使是dba,但是可以從object_usage表中得到.
在9205之前,如果你不慎監控了SYS.I_OBJAUTH1索引,並且不幸在重起資料庫之前沒有停止它,那麼你的資料庫將會無法啟動,並且
不會給出任何錯誤資訊。
以下這條簡單的語句可以輕易再現這個問題:
'ALTER INDEX SYS.I_OBJAUTH1 MONITORING USAGE'