文档课题:alter system flush shared_pool命令解析.标签:00,20,1981,30,system,flush,----------,shared,pool From: https://blog.51cto.com/u_12991611/5787695
数据库:oracle 11.2.0.4 64位
场景描述:
作为DBA,一定遇到过ORA-04031共享池不够用的情况,该告警主要体现在客户端连接异常以及系统响应缓慢等问题上.
解决方案:
可先使用alter system flush shared_pool刷新sga,该语句不会删除procedure与function,只是暂时解决shared_pool中的碎片问题,大量不能共享的sql很快又会产生碎片.根本的解决办法是优化sql,keep经常使用的包、cursor_sharing参数.注意该命令会造成短时间的性能下降,因为parse过的sql都被清理出sga.
测试过程:
查share_pool碎片.
SQL> select count(*) from x$ksmsp;
COUNT(*)
----------
14672
使用此前未曾使用过的查询,让share pool分配内存,增加share pool的chunk碎片.
SQL> select * from scott.emp t where empno in (select t.empno from scott.emp t where t.deptno in (20,30));
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30
7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
11 rows selected.
再次查share_pool碎片.
SQL> select count(*) from x$ksmsp;
COUNT(*)
----------
15069
说明:每个buckets碎片数量>2000就视作不太好的情况,可能会引起share pool latch争用.
SQL> alter system flush shared_pool;
System altered.
SQL> select count(*) from x$ksmsp;
COUNT(*)
----------
5185
总结:执行该命令是将缓存在library cache和data dictionary cache中的sql、pl/sql和数据字典定义都从共享池中清除,在负载很高的生产库慎用该命令.
参考网址:
http://blog.itpub.net/29144194/viewspace-1219756/
https://blog.csdn.net/kadwf123/article/details/8564869
说明:以上内容基本来自以上网址,如有侵权,请联系博主删帖.