我有一个带有自动生成的主键和一个 DateTime 字段的表。我们有几个客户端插入记录,使用来自客户端计算机的时钟作为日期/时间(即它不是真正的“时间戳”字段)。当记录按主键排序时,我遇到过很多日期/时间是小时的情况。起初,我认为客户端计算机时钟已关闭。但我越来越多地认为它可能是数据库上的某种缓存机制。
有什么可以解释的吗?
我有一个带有自动生成的主键和一个 DateTime 字段的表。我们有几个客户端插入记录,使用来自客户端计算机的时钟作为日期/时间(即它不是真正的“时间戳”字段)。当记录按主键排序时,我遇到过很多日期/时间是小时的情况。起初,我认为客户端计算机时钟已关闭。但我越来越多地认为它可能是数据库上的某种缓存机制。
有什么可以解释的吗?
Oracle 不缓存插入或更新:当 DML 语句完成时,意味着更改已经完成。当您提交时,它们是永久性的。
但是,Oracle 可以缓存标识符的生成。如果您的主键是由序列生成的,默认情况下 Oracle 将缓存 20 个键,并且不保证这些键将按照它们被询问的顺序分布。
使用ORDER
关键字:
[...] 保证按照请求的顺序生成序列号。如果您使用序列号作为时间戳,则此子句很有用。对于用于生成主键的序列,保证顺序通常并不重要。
例子:
CREATE SEQUENCE your_sequence ORDER
当然,这假设所有插入也使用SYSTIMESTAMP
or SYSDATE
,如果它们使用客户端日期设置,Oracle 无法对插入进行排序。
最终,它真的很重要吗?对于大多数应用程序来说,只有唯一性很重要,并且可以用 GUID 替换自动增量字段。特别是因为您已经有一个时间戳列。