最近碰到一个例子,数据库系统由于运行大量文本化的sql语句,导致共享池出现大量的碎片,数据库系统性能严重下降,在这种情况下调整这些sql语句,使用更多的绑定变量,共享sql语句及执行计划,对系统提高系统的性能有很大的帮助,当然此时也要把已经出现大量碎片的共享池flush一下。
Alter system flush shared_pool;
需要注意的是,没有放在keep的对象将被全部清理出共享池,此时由于共享池中可以直接使用的对象较少,所以sql语句以及plsql语句执行效率比较低下,但是不久之后系统的性能将直接提高。
尤其需要注意的是那些没有被keep起来的sequence,如果该sequence使用了cache,则这些缓冲将被直接刷新,可能导致sequence的跳跃。
以下是我的测试案例:
SQL> create sequence test_a;
序列已创建。
SQL> select test_a.nextval from dual;
NEXTVAL
----------
1
SQL> alter system flush shared_pool;
系统已更改。
SQL> select test_a.nextval from dual;
NEXTVAL
----------
21
SQL> exec dbms_shared_pool.keep('TEST_A','Q');
BEGIN dbms_shared_pool.keep('TEST_A','Q'); END;
*
ERROR 位于第 1 行:
ORA-06550: 第 1 行, 第 7 列:
PLS-00201: 必须说明标识符 'DBMS_SHARED_POOL.KEEP'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
SQL> @?"rdbms"admin"dbmspool
程序包已创建。
授权成功。
视图已建立。
程序包主体已创建。
SQL> exec dbms_shared_pool.keep('TEST_A','q');
PL/SQL 过程已成功完成。
SQL> select test_a.nextval from dual;
NEXTVAL
----------
22
SQL> alter system flush shared_pool;
系统已更改。
SQL> select test_a.nextval from dual;
NEXTVAL
----------
23