刷新共享池对sequence的影响

最近碰到一个例子,数据库系统由于运行大量文本化的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    

你可能感兴趣的:(sequence)