从10.2.0.1 开始Oracle 会利用伪游标PSEUDO CURSOR 实现对SCHEMA OBJECT的直接访问,以避免 显示地写SELECT语句而造成的性能损耗。 Oracle官方介绍PSEUDO_CURSOR是RDBMS内部的机制 一般不会对USER用户造成问题。 伪游标PSEUDO CURSOR主要是用来访问数据字典表、LOBS、NCHAR、NVARCHAR2这类对象。 我们来具体看一个 伪游标 PSEUDO CURSOR。 创建一个 h$pseudo_cursor视图 以方便我们了解这些神奇的伪游标。 create or replace view h$pseudo_cursor as select Pseudo_cursor, sql_id,obj_id hex_obj_id ,obj# object_id, u.name owner, o.name object_name from (select distinct KGLNAOBJ Pseudo_cursor,kglobt03 sql_id ,substr(KGLNAOBJ ,instr(KGLNAOBJ,'_',1,3)+1 ,instr(KGLNAOBJ,'_',1,4)-instr(KGLNAOBJ,'_',1,3)-1) obj_id ,(case when replace(translate(substr(upper(KGLNAOBJ) ,instr(KGLNAOBJ,'_',1,3)+1 ,instr(KGLNAOBJ,'_',1,4) -instr(KGLNAOBJ,'_',1,3)-1) ,'0123456789ABCDEF','................') ,'.') is null then 'Y' else 'N' end) is_safe_to_compare from x$kglob) k , obj$ o, user$ u where obj#=decode(is_safe_to_compare,'Y',to_number(obj_id,'xxxxxxxxxx'),0) and o.owner#=u.user#;
注意:查询h$pseudo_cursor或x$表,可能会引起严重的library cache latch和mutex contention
column HEX_OBJ_ID format a10
column PSEUDO_CURSOR format a30
column OWNER format a20
select * from h$pseudo_cursor where sql_id='9rcyz9dnbxgp5';
因为是伪游标 所以SQL文本是系统生成的 如 table_XXXXXX ,除非这些 伪游标有真实的 SQL文本,否则这些伪游标一般无法从V$SQL中获得