自己总结和摘录的一些如何发现cursor sharing问题相关的一些SQL,很多是摘自Performance Tuning Guide,绝大部分并非原创。主要是探讨如何去发现相似的SQL或者查找SQL没有共享的原因。
[@more@]-- 如果不知道那个进程或者程序有问题可以在v$sesstat中查看parse count和execute count的比例,比例高说明存在cursor sharing方面的问题
SELECT pa.SID, pa.VALUE "Hard Parses", ex.VALUE "Execute Count"
FROM V$SESSTAT pa, V$SESSTAT ex
WHERE pa.SID = ex.SID
AND pa.STATISTIC#=(SELECT STATISTIC#
FROM V$STATNAME WHERE NAME = 'parse count (hard)')
AND ex.STATISTIC#=(SELECT STATISTIC#
FROM V$STATNAME WHERE NAME = 'execute count')
AND pa.VALUE > 0;
-- 在整个系统角度查看可能没有共享的相似SQL,如果oracle不是10g release 2,可以查看v$sqlarea,当然,SQL相似可能不仅仅有查看前n个字符一个的方法
SELECT SUBSTR(SQL_TEXT, 1, 60), COUNT(*)
FROM V$SQLSTATS
WHERE EXECUTIONS < 4
GROUP BY SUBSTR(SQL_TEXT, 1, 60)
HAVING COUNT(*) > 1;
-- 查看拥有共同执行计划的SQL
SELECT SQL_TEXT FROM V$SQLSTATS WHERE PLAN_HASH_VALUE IN
(SELECT PLAN_HASH_VALUE
FROM V$SQLSTATS
GROUP BY PLAN_HASH_VALUE HAVING COUNT(*) > 4)
ORDER BY PLAN_HASH_VALUE;
-- 查看那些重新parse次数很多的SQL,如果oracle不是10g release 2,可以查看v$sqlarea
SELECT SQL_TEXT, PARSE_CALLS, EXECUTIONS
FROM V$SQLSTATS
ORDER BY PARSE_CALLS;
-- 对于一些一模一样的SQL,如果没有shared,可以通过以下的视图查看原因
-- 有可能是客户端环境不同,用户安全设置不同等等
select * from v$sql_shared_cursor;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/136097/viewspace-1007701/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/136097/viewspace-1007701/