oracle序列中的order属性

时间:2017-02-14 13:20:53

标签: oracle sequence

我有下表结构的表

ACC_ID      ACC_TIMESTAMP
3369376    01-DEC-16 07.21.10
3369379    01-DEC-16 07.25.06
3369371    01-DEC-16 07.30.29
3377485    11-DEC-16 07.47.20

序列详情:

CREATED         15-APR-14 09.38.45
LAST_DDL_TIME   15-APR-14 09.38.45
SEQUENCE_OWNER  ACC
SEQUENCE_NAME   ACC_SEQ
MIN_VALUE           1
MAX_VALUE           999999999999999999999999999
INCREMENT_BY    1
CYCLE_FLAG          N
ORDER_FLAG          N
CACHE_SIZE          20
LAST_NUMBER         87884

如果我按照ACC_TIMESTAMP顺序对表进行排序,我会看到在01-DEC-16 07.30.29处插入的主键值3369371较小。如果在01-DEC-16 07.21.10处插入了更高的值3369376,怎么可能?我的代码期望增加的有序主键应该与时间戳对应。

我认为将ORDER_FLAG设置为Y将遵循基于时间戳的顺序(先到先得)。请帮忙。

输出应为:

ACC_ID      ACC_TIMESTAMP
3369376    01-DEC-16 07.21.10
3369379    01-DEC-16 07.25.06
3369381    01-DEC-16 07.30.29 // something higher value like this, but overall sort on both timestamp and PK value.
3377485    11-DEC-16 07.47.20

2 个答案:

答案 0 :(得分:1)

来自Oracle documentation

  

<强> ORDER

     

指定ORDER以保证在其中生成序列号   请求顺序。如果使用序列,则此子句很有用   数字作为时间戳。保证订单通常并不重要   用于生成主键的序列。

答案 1 :(得分:1)

序列在SGA中管理。请参阅JSCH - Invalid private key,但基本上数据库会按请求顺序递增序列。

除非您在RAC上。默认情况下,RAC节点各自维护自己的序列值缓存,因此数字以块的形式运行,并且来自不同节点的数字是交错的。

但是如果你不在RAC上?也许在应用程序代码中有一些地方,ID和TIMESTAMP没有在同一语句中被抓取。或更新TIMESTAMP的地方。在不知道如何填充ID和TIMESTAMP列的情况下,很难解释。

此外,您发布的序列详细说明了......

LAST_NUMBER 87884

...但您发布的ACC_ID要大两个数量级。那么也许ACC_ID实际上是由其他一些机制生成的?

  

“我的代码期望增加的有序主键应与时间戳对应。”

这是一个不明智的政策。除非您可以保证两个列都填充在同一个语句中并且永远不会被篡改,否则您应该选择一个来提供创建顺序。由于序列主要提供唯一标识符的保证来源,因此您应该依赖时间戳。

但是如果它真的对你很重要并且你在RAC上,那么一定要使用ORDER子句来保证请求顺序:

alter sequence ACC_SEQ order;