影响性能的计算机资源大抵三种:Memory、CPU和I/O。通过调整SGA、PGA充分利用物理MEMORY,通过并行处理充分利用CPU,通过调整I/O分布充分利用硬盘处理力。
server process和PGA是“一条绳上的两个蚂蚱”,故sp还有个雅号叫“用户体验度进程”。SMON主内,负责整理SGA,如空间碎片;PMON负责外交,检测client process和server process。
shared pool的命中率(hiting)=L/(L+P).L:逻辑读;P:物理读。命中率高不一定没问题,如100w/(100w+10w),10w物理读I/O绝对是个问题。
shared pool的结构主要有:
① free memory :可用内存
② library cache :sql、pl/sql、java等代码;执行计划
③ row cache :数据字典信息
free memory的内存被分割成大小参差的chunk,然后用chain串起,每条chain上所挂的chunk都是不一样的,如chain_A挂了4k,chain_B挂了8k,chain_C挂了12k,现有条sql在parse时,需10k chunk,则server process会去遍历chain_B,假设找到了11k的chunk,那么有10k chunk用去存该sql的代码和执行计划,1k碎片chunk则被挂到chain_A上。记住了,只有hard parse才需要从free memory遍历chain,确定合适的chunk。这1k碎片会被SMON整理。
从上面的论述,我们也可以知道,Oracle是通过chain来维护shared_pool,这样做的好处:
㈠ 串起内存块
㈡ 可遍历
我们还可以认识到hard parse和soft parse之间的两个最大的不同:
Ⅰ 二者最大,且最严重的区别是,hard parse需要从N条执行方案挑出一条最优的,作为该sql的执行计划
Ⅱ hard parse需要到free memory摘得chunk,填上sql、执行计划,然后挂到library cache
查看hard parse 和 soft parse的个数: