从不sequential的sequence

       遇到过好多问题关于如何在ORACLE 中创建类似SQLSERVER或ACCESS中自增长字段。答案多是先建立一个Sequence,然后在Trigger中将Sequence的NEXTVAL的取值赋予所需要的列。看上去还不错。

       

        但是一切真的那么顺利吗?Sequence 真的可以做到提供一序列连续没有遗漏的序列数值吗?

         不妨作个实验:

 

SQL> create sequence test_seq start with 1;

Sequence created.

SQL> create table test_tab ( x int) ;

Table created.

SQL> insert into test_tab values (test_seq.nextval) ;

1 row created.

SQL> insert into test_tab values (test_seq.nextval) ;

1 row created.

SQL> insert into test_tab values (test_seq.nextval) ;

1 row created.

SQL> commit;

Commit complete.

SQL> select * from test_tab ;

X
----------
1
2

3

SQL> conn / as sysdba;
Connected.
SQL> alter system flush shared_pool ;

System altered.

SQL> conn user1/user1
Connected.
SQL> insert into test_tab values (test_seq.nextval) ;

1 row created.

SQL> commit;

Commit complete.

SQL> select * from test_tab ;

X
----------
1
2

3
21

 

 

         从试验中可以看出,在缺省情况下,我们建立的是带有Cache选项的Sequence (缺省值是20), 它的作用是预先将一定数量的序列值存放在SGA中,便于快速访问。可是它的副作用就是这部分数值可能会被清除, 当下一次获取NEXTVAL时,就会不可避免地造成序列值丢失。

         总结一下,在以下情况下,序列值会丢失:

 

1.  数据库关闭或重起 ,由于整个SGA会被清除,所以Cached的序列值同样会被清除。

2.        类似于普通的Data Block ,当SGA中需要放置新的数据,Cached的序列值可能会按照SGA的数据存放规则被清除。

 

读到这里,细心的读者也许会问,如果在创建Sequence时,有意不选用Cache选项,问题不就解决了吗?且慢,还有两点需要注意:

 

1. 访问效率降低,没有Cache功能的Sequence取值将无法直接访问内存

2. 不论是Nocache还是Cache , 每次访问NEXTVAL的过程都是不可逆的,在同一session中,在执行一系列DML和Sequence的操作后,用户执行Rollback,希望将操作回滚,但是Sequence此时就显得异常顽固,用掉的NEXTVAL将无法被重现。当下一次试图读取NEXTVAL时,Sequence的指针又移动到下一位了。

 

        看来Oracle真是一个海洋,每个细小的知识点都是那么饶有趣味,值得我们去努力专研啊。

 

 

备注:使用Cache功能对Sequence读取效率的影响

Connected to:

Oracle8i Enterprise Edition Release 8.1.7.4.1 - Production

With the Partitioning option

JServer Release 8.1.7.4.1 - Production

 

SQL> set timing on

SQL> set autotrace traceonly statistics

SQL> SELECT * FROM ALL_OBJECTS;

14302 rows selected.

Elapsed: 00:00:13.05

Statistics

----------------------------------------------------------

          7  recursive calls

          4  db block gets

     146635  consistent gets

          0  physical reads

          0  redo size

    1633344  bytes sent via SQL*Net to client

     117520  bytes received via SQL*Net from client

        956  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

      14302  rows processed

 

SQL>

SQL> -- 测试带有CACHE选项的Sequence:

SQL>

SQL> CREATE SEQUENCE test_seq1 CACHE 1000;

 

Sequence created.

 

Elapsed: 00:00:00.00

SQL> SELECT x.*, test_seq1.NEXTVAL FROM ALL_OBJECTS x;

 

14303 rows selected.

 

Elapsed: 00:00:13.09

 

Statistics

----------------------------------------------------------

        202  recursive calls

         64  db block gets

     146636  consistent gets

          0  physical reads

      10468  redo size

    1752002  bytes sent via SQL*Net to client

     117543  bytes received via SQL*Net from client

        956  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

      14303  rows processed

 

SQL>

SQL> --测试不带有CACHE选项的Sequence

SQL>

SQL> DROP SEQUENCE test_seq1;

 

Sequence dropped.

 

Elapsed: 00:00:00.00

SQL> CREATE SEQUENCE test_seq1 NOCACHE;

 

Sequence created.

 

Elapsed: 00:00:00.00

SQL> SELECT x.*, test_seq1.NEXTVAL FROM ALL_OBJECTS x;

 

14303 rows selected.

 

Elapsed: 00:00:32.02        (执行时间明显长了)

 

Statistics

----------------------------------------------------------

     185946  recursive calls

      57216  db block gets

     160925  consistent gets

          0  physical reads

   10004008  redo size

    1752002  bytes sent via SQL*Net to client

     117543  bytes received via SQL*Net from client

        956  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

      14303  rows processed

 

       

                                                                BLACK_SNAIL

                                                                欢迎交流,转载注明

                                                             ligang1000@hotmail.com/ligang@fujitsu.sh.cn                                                                                                                      

时间: 2024-09-08 10:17:19

从不sequential的sequence的相关文章

NoSQL Databases - CouchDB

CouchDB还是蛮有意思的一个DB, 总结一下, 他重要的特点 1. 最大的特点就是他的file layout and commitment system, 并由此可以保证ACID特性, 在Nosql里面相当有特点, 参考5.1.6 2. 采用View机制, 这个很方便, 通过javascript就可以简单的定义view, 并可以通过map/reduce逻辑生成view, 但要注意的是, 这是伪map/reduce, 因为只能在单机上运行, 只是使用了这种模型而已. 但存在一个问题, View

LeetCode:Permutation Sequence

题目链接:http://oj.leetcode.com/problems/permutation-sequence/ The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the permutations in order, We get the following sequence (ie, for n = 3): "123" "132&q

深度 | Nature论文详解概率机器学习:从不确定性表征到自动建模(附论文)

机器如何从经验中学习?概率建模提供了一个框架,帮助我们理解什么是学习,也因此成为了设计可从经验数据中学习的机器的主要理论和实践办法.这种描述了如何表征和控制模型和预测的不确定性的概率框架,在科学数据分析.机器学习.机器人技术.认知科学以及人工智能领域中扮演着中心角色.这篇评论介绍了这种框架,并讨论了该领域的最新进展--即概率编程.贝叶斯优化.数据压缩以及自动模型发现. 机器学习概率框架的核心思想是:学习可被看作是推理合理模型以用于解释被观测到的数据的过程.一台机器可以利用此模型去预测未来数据,并

hdu 2454 Degree Sequence of Graph G

点击打开链接 Degree Sequence of Graph G Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1997    Accepted Submission(s): 850 Problem Description Wang Haiyang is a strong and optimistic Chinese youngst

在MSSQL中实现Sequence功能

目的: 通过该功能取代 MSSQL 中的表ID列自动递增功能   主题一:如何通过Sequence名得到一个Sequence值 方法: 1.    创建一个表Sequence,保存Sequence的值 2.    创建一个存储过程GetNextSequence,以通过它得到下一个Sequence 主题二:如何通过一个表名得到一个Sequence值 1.    创建一个表TableSequence,保存表中的列对应的是哪个Sequence 2.    创建一个存储过程CreateTableSeq,

Access错误提示之Selected collating sequence not supported by the operating system.

access|select|错误|access|select 太久没更新这个Blog了,不是不想写,只是平时接触到的ASP编程几乎都是背书状态,没什么创意的Coder工作,没有新意,也没什么感悟,无从写起啊..搞得靳田兄把我的链接去掉都不好意思答复了.对此先对靳田兄说声抱歉. 正题,这几天接了个小系统写,写的过程还是那无创意的背书状..不过,在使用时却遇到一个奇怪的问题.客户用的是英文操作系统英文版的IIS.程序运行到Conn.execute(..)时居然提示: Selected collati

ORACLE中序列-sequence的应用

oracle oracle中没有象Acces中自动编号的字段类型,所以在oracle中要想用一个字段自动增值,还比较麻烦,在此提供给大家一个方法,利用序列,来完成字段的自动增加,下边介绍一下怎么创建序列,使用序列,和删除序列. 1.创建序列--------------create sequence  create sequence  Seq_AutoID   //所起序列名叫 Seq_AutoID ,需要记住此序列名,以后方可调用 minvalue   1   //最小值从1开始 可以根据自己的

[分享]解决Access错误 Selected collating sequence not supported by the operating system

access|select|错误|解决 一直想把唐人街中文论坛搬到 1and1 服务器上来.今天总算有空将所有的文件上传来了,但试运行时却发现以下错误提示: Selected collating sequence not supported by the operating system. Google了一下,发现不止我一个人有这问题.主要原因是我现在用的这 web hosting 公司用的是英文操作系统英文版OS.论坛所用的 Access文件是动网所附的,言外之意是在中文操作系统下制作的.而根

UVa 10706:Number Sequence

链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=113&page=show_problem&problem=1647 原题: A single positive integer i is given. Write a program to find the digit located in the position i in the sequence of n