日期:2014-05-16  浏览次数:20492 次

【每日一摩斯】-Shared Pool优化和Library Cache Latch冲突优化 (1523934.1)-系列6

使用SQL 查看Shared Pool问题

       这一章节展示了一些可以用来帮助找到shared pool中的潜在问题的SQL语句。这些语句的输出最好spool到一个文件中。

注意:这些语句可能会使latch竞争加剧,我们在上面的"使用 V$ 视图 (V$SQL 和 V$SQLAREA)" above.


查找literal SQL

SELECT substr(sql_text,1,40) "SQL",
               count(*) ,
               sum(executions) "TotExecs"
FROM v$sqlarea
WHERE executions < 5
GROUP BY substr(sql_text,1,40)
HAVING count(*) > 30
ORDER BY 2;
这个语句有助于找到那些经常被使用的literal SQL

检索Library Cache hit ratio

SELECT SUM(PINS) "EXECUTIONS",
SUM(RELOADS) "CACHE MISSES WHILE EXECUTING"
FROM V$LIBRARYCACHE;
如果misses/executions高于1%的话,则需要尝试减少library cache miss的发生。
改造
SELECT SUM(PINS) "EXECUTIONS",
SUM(RELOADS) "CACHE MISSES WHILE EXECUTING",
SUM(RELOADS)/SUM(PINS)
FROM V$LIBRARYCACHE;

检查hash chain的长度
SELECT hash_value, count(*)
FROM v$sqlarea
GROUP BY hash_value
HAVING count(*) > 5;
这个语句正常应该返回0行。如果有任何HASH_VALUES存在高的count(两位数的)的话,你需要查看是否是bug的影响或者是literal SQL使用了不正常的形式。建议进一步列出所有有相同HASH_VALUE的语句。例如:
SELECT sql_text FROM v$sqlarea WHERE hash_value= ;
如果这些语句看起来一样,则查询V$SQLTEXT去找完整的语句。有可能不同的SQL文本会映射到相同的hash值,比如:在7.3中,如果一个值在语句中出现2次而且中间正好间隔32个字节的话,这两个语句会映射出相同的hash值。

检查高版本
SELECT address, hash_value,
               version_count ,
               users_opening ,
               users_executing,
               substr(sql_text