SQL>select * from v$session;
从这里确定根据machine列和program列确定SID。
根据SID 确定SQL:
/* Formatted on 2010/9/6 11:08:21 (QP5 v5.115.810.9015) */
SELECT a.sql_text,
b.status,
b.last_call_et,
b.event
FROM v$sql a, v$session b
WHERE a.sql_id = b.sql_id AND b.sid = 23
也可以根据进程号来查看。具体参考Blog:
oracle 实时查询最耗CPU资源的SQL语句
1> 先通过top命令查看产用资源较多的spid号
2>查询当前耗时的会话ID,用户名,sqlID等:
select sid,serial#,machine,username,program,sql_hash_value,sql_id,
to_char(logon_time,'yyyy/mm/dd hh24:mi:ss') as login_time from v$session
where paddr in (select addr from v$process where spid in ('5648612','256523'));
3> 如果上一步sql_id或者 hash_value不为空,则可用v$sqlarea查出当前正在使用的sql
select sql_text
from v$sqltext_with_newlines
where hash_value = &hash_value
order by piece;
select * from v$sql where sql_id=''
---CSDN 网友提供的----
SELECT sql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address) IN
(SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),
DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr = (SELECT addr FROM v$process c WHERE c.spid = '&pid'))
ORDER BY piece ASC
1.1.2 用V$SQL 查看SQL执行和等待时间
对于已经执行完毕的会话,可以在V$SQL视图中找到它的执行时间和消耗的CPU时间,这些信息对我们分析一些性能上存在问题的SQL有用处。比如对比SQL 消耗的CPU 和执行时间,就可以大致知道SQL语句执行中是否有长时间的等待事件:
/* Formatted on 2010/9/6 13:05:05 (QP5 v5.115.810.9015) */
SELECT sql_text,
cpu_time / (1000 * 1000) t_cpu,
TRUNC (elapsed_time / (1000 * 1000)) t_elap,
(cpu_time / elapsed_time / (1000 * 1000)) * 100 pct
FROM v$sql
WHERE sql_text LIKE 'insert into sf select%'
SQL_TEXT T_CPU T_ELAP PCT
------------------------------ ---------- ---------- ----------
insert into sf select * from u .312002 0 .000056249
insert into sf select * from u .296402 0 .000062524
SQL> show parameter cursor_sharing;
NAME TYPE VALUE
------------------------------------ ----------- ------
cursor_sharing string EXACT
查看SQL:
SQL> select parsing_user_id puid,parsing_schema_id psid,sql_text,sql_id,child_address from v$sql where sql_text like 'insert into t%';
PUID PSID SQL_TEXT SQL_ID CHILD_AD
---------- ---------- ------------------------------ ------------- --------
0 0 insert into tabpart$ (obj#, da 9hp6m1g7j275b A21042D8
0 0 insert into tab$(obj#,ts#,file asnhcg241fr2y A877959C
查看不能重用原因:
SQL> select * from v$sql_shared_cursor where sql_id='asnhcg241fr2y';
SQL_ID ADDRESS CHILD_AD CHILD_NUMBER U S O O S L F E B P I S T A B D L T B I I R L I O E M U T N F A I T D L D B P C S C P T M B M R O P M F L P L A F L R L H P B
------------- -------- -------- ------------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
asnhcg241fr2y A8779678 A877959C 0 N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N
示例1:查询active的session:
SQL> select status,last_call_et,event from v$session where sid=23;
STATUS LAST_CALL_ET EVENT
-------- ------------ --------------------------------------------
INACTIVE 9976 SQL*Net message from client
/* Formatted on 2010/9/6 16:52:32 (QP5 v5.115.810.9015) */
SELECT a.sql_text,
b.status,
b.last_call_et,
b.event
FROM v$sql a, v$session b
WHERE a.sql_id = b.sql_id AND b.sid = '279';
这个视图记录了某个session从运行以来各种资源统计数据,通过关联表v$statname 可以查询出某个session的资源消耗情况,如:
/* Formatted on 2010/9/6 17:06:56 (QP5 v5.115.810.9015) */
SELECT a.sid, b.name, a.VALUE
FROM v$sesstat a, v$statname b
WHERE a.sid = 23 AND a.statistic# = b.statistic#
AND b.name IN
('consistent gets',
'physical reads',
'parse count (total)',
'parse count (hard)');
2.1.2 cursor_sharing=similar
SQL> alter session set cursor_sharing=similar;
会话已更改。
SQL> select * from all_objects set_similar where object_id=10;
SQL> select * from all_objects set_similar where object_id=20;
SQL> select sql_text from v$sql where sql_text like '%set_similar%';
SQL_TEXT
------------------------------------------------------------------------------
select * from all_objects set_similar where object_id=:"SYS_B_0"
select * from all_objects set_similar where object_id=:"SYS_B_0"
如果你测试的结果不一样,把共享池清空一下就可以了:
SQL> alter system flush shared_pool;
SQL> alter session set cursor_sharing=force;
SQL> select * from all_objects set_similar where object_id =2;
SQL> select * from all_objects set_similar where object_id =1;
SQL> select sql_text from v$sql where sql_text like '%set_similar%';
SQL_TEXT
--------------------------------------------------------------------------
select * from all_objects set_similar where object_id =:"SYS_B_0"
如果你测试的结果不一样,把共享池清空一下就可以了:
SQL> alter system flush shared_pool;