8. 库缓存相关的诊断工具
/v$sgastat 可以显示所有SGA组件的大小
/v$librarycache 关于library中对象的统计信息,非常重要
/v$sql 可以查看cursor,parent SQL text, child of the origial SQL
这里介绍以下child cursor
user A: select * from tblA
user B: select * from tblA
大家认为这两条语句是不是一样的啊,可能会有很多人会说是一样的,但我告诉你不一定,那为什么呢?
这个tblA看起来是一样的,但是不一定哦,一个是A用户的, 一个是B用户的,这时他们的执行计划分析代码
差别可能就大了哦,哈哈,如果前面加了限定大家就明白了: select * from A.tblA,select * from B.tblA
这是不一样,当然前面不加限定的也可能是一样的。
/v$sqlarea: 这个数据表相当与对v$sql做group by 了,并且和v$sql一样每条只可以看到1000个字符
/v$sqltest: 这个试图可以查看Sql等的全部内容啦,分行的哦
/v$db_object_cache: 显示缓存的对象,包括对应的namespace,type和gets,pins等统计信息
/相关初始化参数:shared_pool_size, open_cursors, session_cached_cursors, cursor_space_for_time
cursor_sharing, shared_pool_reserved_size
/statspack等工具
9. 是否共享了Cursor
/查询V$librarycache,检查SQL AREA的gethitratio
select gethitratio from v$libararycache where namespace='SQL AREA';
这个命中率 = gethits/gets, 表示软分析次数与分析次数的比值
OLTP系统应该>=90%,如果<90%,你可能需要
--改写你的应用程序中的Statement了,提高效率。但往往你可能无法去调整应用程序的代码,因为你没有。
--增加共享池的大小
--调查那些SQL正在执行
select sql_text, users_excuting,executions, loads from v$sqlarea;
--users_excuting查询的时候,正在执行的次数
--excutions 总的执行次数
--loads 这个数值越低越好
select * from v$sqltext where sql_text like 'select * from hr.employees where %';
10. 共享游标
/初始化参数 CURSOR_SHARING,有三个取值:exact, similar, force
--exact 默认值,2个sql语句必须完全一样才共享缓存中的已分析代码
--similar 当2个sql仅只有参数变量值不一样而结构完全一样时,而且执行计划一样就共享
--force 当2个sql仅只有参数变量值不一样而结构完全一样时也共享,不考虑执行计划的影响,比如
select * from employees where employee_id=1000;
select * from employees where employee_id=1234;
11. 准则:库缓存的丢失率(reloads)
/reload应该小于PINS的1%
select sum(pins) "executions", sum(reloads) "cache misses",
sum(reloads)/sum(pins) from v$libararycache;
/当其>1%时,有两种可能的原因
--因为没有空间了,曾经分析执行过的代码被赶出去了,对策:增加shared pool大小,当然SGA要有空闲空间
--共享的代码 invalidated了
对策:避免在高负荷时修改数据结构和收集数据统计,创建索引等,把这些工作调整到负荷低的时候去做
12. 调整库缓存
/当gethitratio<90%或丢失率>1%时,就需要优化
/对于频繁要用的PL/SQL包,触发器,sequence,永久将他们缓存在内存中
/为常用的SQL定义足够的内存
/为大内存需求的对象保留空间,这样可以避免碎片(碎片会导致这些内存不可用而浪费)
/栓住那些常用的对象
/将大的匿名PL/SQL块改写成小的包函数
将匿名PL/SQL块改写成存储过程,不管他们是大还是小的匿名块
13. 共享池建议
可以通过OEM来查看oracle server建议的共享池大小,也可以查询视图
select shared_pool_size_for_estimate as pool_size, estd_lc_size,estd_lc_time_saved from v$shared_pool_advice;
shared_pool_size_for_estimate:表示估计的共享池大小,取值范围,当前库缓存大小的50---200%,每个估计值一行
estd_lc_size: 对应分配的library cache大小,
estd_lc_time_saved: 估计的能保留的时长
怎么决定库缓存的大小呢,当estd_ls_size增大时,estd_lc_time不再发生变化时,我们取第一个这样的share_pool_size_for_estimate作为我们的共享池大小。
14. 执行计划
/oracle server把SQL解析执行过的执行计划缓存在内存中,供下次共享使用,而不必再执行一次硬分析,直接找到相应的内存中的执行计划来执行SQL
/当SQL在内存中被淘汰,相对应的执行计划也会被请出libarary cache
/这个特性最主要的好处就是能更好的诊断查询执行效率
/怎样查询SQL的执行计划
select operation,object_owner,object_name,cost from v$sql_plan order by hash_value
/在v$sql视图中有一列hash_value(书上错:不应该是书上说的plan_hash_value)和v$sql_plan的列hash_value相对应
/hash_value还可以用来比较Cursor SQL TEXT是否相似
15 计算Global Space
/计算存储对象需要的空间大小,比如包,函数,存储过程
select sum(sharable_mem) from v$db_object_view
[where type in ('PACKAGE','PACKAGE BODY','PROCEDURE','FUNCTION')]
/计算经常执行的SQl需要的空间大小
select sum(sharable_meme) from v$sql_are where execution>5
/计算高峰时所有打开游标需要的空间,假如每个用户每个游标的最大允许大小是250B
select sumI(250*user_opening) from v$sqlarea
/理想状态下,您的生产环境的library cache应该是这些数字之和,并且加上一定的缓冲大小
/在测试环境中,你也可以用一个典型用户来计算可能需要需要的平均游标空间,
select 250*value bytes_per_user from v$sesstat s, v$statname n where s.statistic$=n.statistics#
and n.name='opened cursors curent' and s.sid=15;
16. 大内存需求(oracle自身运行的大程序段,package等,超过1万byte的程序段)
/有大的连续内存满足需求
/在共享池中为他们保留一定的连续空间
/V$shared_pool_reserved视图中的列说明
--free_space: 保留空间列表中所有的空闲空间
--Avg_Free_Size: 保留空间列表空闲内存的平均值
--Max_Free_Size: 保留空间列表空闲内存的最大值
--Request_misses:因为没有一个满足需求的连续空闲内存,LRU列表不得不flush对象来满足请求的次数
--request_failuers: 没有空闲空间导致请求失败的次数
--last_failures_size:最后一次请求失败需要的内存大小
--其他
/初始化参数:shared_pool_size
shared_pool_reserved_size 一般为share_pool_size的10%, 是shared_pool_size的一部分,不是另外开辟一块内存
最大值是share_pool_size的50%, 大于50%会报错

