Oracle 12c支持哪些ID生成策略?
哪种ID生成策略最适合使用/性能最好
我在读关于身份证生成的帖子:http://sadalage.com/blog/2017/06/12/id-generation/
并想检查IDENTITY Id生成策略在往返数据库方面是否真的存在缺陷,或者优化器是否可以阻止这种情况?
数据库中没有由标识列引起的开销。我认为文章中的一些说法是有缺陷的。声明:
"标识ID生成不支持预分配,因此需要在每次插入后进行选择">
对于ORM来说可能是true,但对于数据库来说肯定不是true。大多数数据库都支持RETURNING子句,因此从标识列生成的值通常作为插入的一部分进行检索,即:
insert into MY_TABLE
values ( ... )
returning ID_COLUMN into :my_host_variable
因此,这听起来更像是他们选择了一个做得不够好的ORM。
类似地,语句
"在Oracle12c中,删除表不会删除与标识列关联的序列,从而在数据库中留下过时的序列">
被琐碎地证明是错误的:
SQL> create table t ( x int generated as identity );
Table created.
SQL> select sequence_name from user_sequences;
SEQUENCE_NAME
--------------------------------------------------------
ISEQ$$_159461
SQL> drop table t purge;
Table dropped.
SQL> select sequence_name from user_sequences;
no rows selected.
这也用来证明IDENTITY列(在Oracle中)无论如何都是作为序列实现的。所以
"如果数据库提供了使用序列的功能,就应该使用它们。在不提供序列的数据库中,必须使用标识列">
这是一个值得怀疑的说法。