sequence跳号问题及解决办法
(2011-03-30 14:16:02)
标签:
杂谈 |
分类: ORACLE |
一、
--创建序列
CREATE SEQUENCE NYYTEST.S_TEST
SQL> select S_TEST.nextval from dual;
----------
SQL> select S_TEST.nextval from dual;
----------
SQL> select S_TEST.nextval from dual;
----------
SQL> select S_TEST.nextval from dual;
----------
SQL> select S_TEST.nextval from dual;
----------
--刷新共享池,刷新共享池会使所有的没有使用DBMS_SHARED_POOL.KEEP固定的对象全部被清除,所以共享池刚刚刷新的时候,SQL和PL/SQL的执行效率会略微下降
SQL> ALTER SYSTEM FLUSH SHARED_POOL;
系统已更改。
--由于cache的20个序列号已经从共享池中被清除,下次再取序列的nextval值取的是21
SQL> select S_TEST.nextval from dual;
----------
关于序列设置cache之后跳号问题的原因:cache会把sequence缓存在lb
二、
为了避免上述情况,ORACLE给我们提供了把SEQUENCE KEEP到SHARED POOL中的方法,这样就保证了SEQUENCE的CACHE不会被交换出去,从而避免了这种情况的发生。
如果将对象固定在内存中,那么在下一次关闭数据库之前,这个对象就不会失效或者被清空。还需要考虑的是,Metalink的注意事项61760.1:DBMS_SHARED_POOL将被创建为用户SYS。其他用户不拥有这个包。需要访问这个包的任何用户都必须由SYS授予执行权限。如果在SYS模式中创建这个包并在不同的模式中运行示例代码,则首先必须给用户赋予DBMS_SHARED_POOL上的EXECUTE权限。
默认情况下dbms_shared_pool包是不在系统中的,需要运行$ORACLE_HOME/rdbms/admin/dbmspool.sql进行创建
SQL> desc dbms_shared_pool;
ERROR:
ORA-04043: 对象 dbms_shared_pool 不存在
--创建
SQL> @E:\oracle\RDBMS\ADMIN\dbmspool.sql
程序包已创建。
授权成功。
视图已创建。
程序包体已创建。
--查看包对象
SQL> desc dbms_shared_pool;
PROCEDURE ABORTED_REQUEST_THRESHOLD
参数名称
------------------------------ ----------------------- ------ --------
PROCEDURE KEEP
参数名称
------------------------------ ----------------------- ------ --------
PROCEDURE SIZES
参数名称
------------------------------ ----------------------- ------ --------
PROCEDURE UNKEEP
参数名称
------------------------------ ----------------------- ------ --------
--授权
SQL> grant execute on dbms_shared_pool to nyytest;
授权成功。
SQL> create synonym nyytest.dbms_shared_pool for dbms_shared_pool;
同义词已创建。
procedure keep参数的解释:
exec dbms_shared_pool.keep
如果不输入,则默认为package/procedure/function中的一个;
procedure keep(name varchar2, flag char DEFAULT 'P')
name
测试结果
S_TEST和S_TEST2序列都是设置cache20,将s_test序列keep到shared pool中
SQL> select S_TEST.nextval from dual;
----------
SQL> select S_TEST.nextval from dual;
----------
SQL> select S_TEST2.nextval from dual;
----------
SQL> exec dbms_shared_pool.keep('s_test','q');
PL/SQL 过程已成功完成。
SQL> select S_TEST2.nextval from dual;
----------
SQL> select S_TEST.nextval from dual;
----------
-- dbms_shared_pool.unkeep的作用是取消已经keep在shared pool中的对象
SQL> exec dbms_shared_pool.unkeep('s_test','q');
PL/SQL 过程已成功完成。
SQL> select S_TEST.nextval from dual;
----------
SQL> alter system flush shared_pool;
系统已更改。
SQL> select S_TEST.nextval from dual;
----------