Oracle数据库不再追求完美的序列(oracle 不要序列)
在最新的Oracle 19c数据库中,我们可以看到一个重要的变化:Oracle不再追求完美的序列。在过去的Oracle数据库版本中,序列一直是一个很重要的功能,它被广泛应用于各种业务场景中,例如ID生成、数据补偿等等。然而,在一些特定场景下,序列的完美性很难得到保证,而这也造成了一些性能问题。因此,为了解决这些问题,Oracle 19c数据库引入了一些新的变化。
一、Oracle数据库中序列的问题
序列是Oracle数据库中一个很重要的对象,它主要用于生成唯一的数字ID,通常用于主键自增、批处理事务以及一些需要唯一ID的场景中。
然而,在性能要求较高的场景下,序列的精确性可能带来一些问题。事实上,序列的特殊性在一些极端情况下可能会导致性能瓶颈。比如在高并发的批处理场景下,序列的精确性会导致较大的锁争用,从而影响性能表现。在这种情况下,牺牲一定的序列的完美性,可以从根本上解决性能问题。
此外,Oracle数据库在处理序列过程中也存在一些潜在的风险。由于序列的特殊性设计,一些序列的批量操作会对内部缓存产生一些影响,从而影响性能表现。
二、重新定义Oracle的序列
为了解决以上问题,Oracle 19c引入了一些新的变化,重新定义了我们对于序列的理解。
1. 类似MySQL数据库中的auto_increment
Oracle 19c数据库中的序列引入了像MySQL数据库中的auto_increment的功能。通过该功能,我们可以在序列的获取时快速生成ID,而无需持续保证其精确性。这样,可以大幅度提高性能表现。
代码示例:
CREATE TABLE test (
id NUMBER GENERATED AS IDENTITY, — 声明 IDENTITY 列。
name VARCHAR2(30)
);
INSERT INTO test (name)
VALUES (‘John’);
SELECT id, name
FROM test;
2. 可度量序列
在Oracle 19c中,我们还可以度量序列的性能表现。通过这一功能,我们可以明确序列的性能表现,并对其性能进行针对性优化。
代码示例:
SELECT DBMS_SHARED_POOL.TRACEFILE_IDENTIFIER, x.RUNID, round((x.value – y.value) * z.frequency / 1000000) elapsed_msec
FROM v$systat x, v$systat y, v$parameter z
WHERE x.statistic# = 375 and y.statistic# = 376 and z.name = ‘cpu_count’;
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK (d.task_name) report
FROM dba_advisor_tasks d
WHERE d.advisor_name = ‘SQL Tuning Advisor’;
三、 总结
在Oracle 19c数据库中,我们可以看到一个非常重要的变化:Oracle不再追求完美的序列。这一变化可以帮助我们更好地理解序列的本质,并通过新功能对序列的性能进行优化。
我们相信,随着更多的应用场景的涌现,Oracle序列的性能优化将会变得越来越重要,而Oracle 19c中的这些变化,无疑为优化序列的性能表现提供了更好的基础。