Oracle 数据库 IDENTITY 列的性能选项
在上一篇文章Oracle 数据库 IDENTITY 列中,我们介绍了Oracle IDENTITY列的基础知识。本文将介绍IDENTITY列的几个性能选项。由于IDENTITY列内部使用sequence机制,因此也等同于是sequence的性能选项。
由于sequence是递增的,在高并发时,会导致其索引最右侧leaf页的争用。为解决此问题,sequence提供了2个选项。
CACHE选项
指定数据库预先分配并保存在内存中的序列值的数量,以便更快地访问。其默认值为20
SQL> create sequence seq01;
SQL> select max_value, cache_size from user_sequences;MAX_VALUE CACHE_SIZE
---------- ----------
1.0000E+28 20SQL> drop sequence seq01;
此值越大,Oracle更新内部表的次数就越少,因此性能影响就越小,反之亦然。
好的消息是,Oracle在19.10版本后,新增了Sequence dynamic cache resizing功能,详见MOS:Sequence dynamic cache resizing feature (Doc ID 2790985.1)。
该功能默认启用,不需要 DBA 或最终用户进行额外设置。此功能根据序列号的消耗率动态调整序列缓存的大小。因此,序列缓存大小可能会远远超出配置的 缓存大小。
SCALE选项
SCALE选项实际就是18c推出的Scalable Sequences功能,详见MOS:18c Scalable Sequences (Doc ID 2341262.1)。
此功能可以提高将数据加载到以序列值作为键的表中的性能。此功能内部通过添加实例和会话偏移量,可显著降低跨 RAC 实例加载数据和在单个实例内进行多个加载过程时发生序列和索引块争用的可能性。
我的理解是,此选项将数据打散,缓解了索引块争用。但又不至于像SYS_GUID那么分散,从而IO比SYS_GUID引发的少。所以,本质上是一种折中。
IDENTITIY列对以上两选项的支持
这里单列一节,以纠正在上一篇文章Oracle 数据库 IDENTITY 列中疏漏。
在19c SQL语言参考中,CREATE TABLE语句中identity_options的语法链如下:
其中只有CACHE,没有SCALE选项。实际上后面还有这么一句:
Refer to CREATE SEQUENCE for a full description of these parameters and characteristics.
因此,完整的identity_options选项需要参考CREATE SEQUENCE命令,也就是下图。可以看到CACHE和SCALE都是支持的:
在19c,数据库中验证一下:
CREATE TABLE staging_t (id NUMBERGENERATED BY DEFAULT ON NULL AS IDENTITY ( CACHE 100 SCALE),c1 VARCHAR2(100),c2 DATE
);
完美,IDENTITY列也支持SCALE选项。
最后强调一点,升级到19c,升级到19c的最新版本。目前最新是19.25。
参考
- 18c Scalable Sequences (Doc ID 2341262.1)
- 18c Scalable Sequences Part III (Too Much Rope)
- Scalable Sequences in Oracle Database 18c