我试图了解数据库是否更高效地管理 id/sequence 生成以用作 PK 或让应用程序简单地生成它自己的 ID,例如随机的 64 位数字。
我的怀疑是应用程序 + 随机生成会更高效,因为要管理的并发性更少,但话又说回来,如果数据库生成一个序列,那么它总是知道接下来的内容是有序的,并且可以优化索引维护。
我试图了解数据库是否更高效地管理 id/sequence 生成以用作 PK 或让应用程序简单地生成它自己的 ID,例如随机的 64 位数字。
我的怀疑是应用程序 + 随机生成会更高效,因为要管理的并发性更少,但话又说回来,如果数据库生成一个序列,那么它总是知道接下来的内容是有序的,并且可以优化索引维护。
PK 背后的理念是它们在设计上是独一无二的。使用 64 位随机数在设计上并不是唯一的 - 因此您必须为 PK 冲突准备代码,然后随机化一个新 id,然后再次将新行提交到数据库。这可能很麻烦。让编写者同时插入新数据最终会使这些问题变得更糟。
数据库可以很好地生成唯一的 id - 毕竟,PK 问题是非常标准的问题,并且有很好的标准解决方案。
ID 生成器本身就是一个瓶颈——因为它必须确保唯一性,即使它是从多个会话并行调用的。例如,Oracle 有序列生成器,可以预先生成并“缓存”每个会话即将到来的数字,从而解决并发问题。
我们可以从 Tom Kyte 先生那里学到一件事:使用表格中的真实数据和实际负载来衡量您的用例。这是真正智慧的唯一来源:)
我的两分钱:数据库引擎差别很大!共享您正在使用的数据库有助于获得更好的答案。