我们说我有一个包含N
行的表格,但没有可以作为主键的现有列。
我想生成一个(为了我的方便和完整)。
我有几个选择。
我认为GUID有其优点和缺点。
在顺序整数上使用随机生成的整数是否有一些优势?
索引列上的任何CRUD操作都不应受到影响。如果你正在进行批量加载,我会暂时关闭索引然后将其恢复
我无法找到理由,但我遇到过某种情况(在这种情况下是甲骨文),有人做过这种情况,我希望它超过"什么&&#34 #39; sa sequence
?"。
答案 0 :(得分:3)
由于您已经看到选择此方法的特定实现,我们只能推测原始开发人员可能在思考的内容。这总是会出错。
我的猜测是原始开发人员试图避免序列生成密钥中索引中最右边的块成为阻止尝试插入的许多不同会话的资源的问题。 "热块"出现问题是因为执行insert
的每个会话都需要修改最右侧块中的数据(假设顺序键),因此Oracle需要序列化访问。在大多数系统中,这不是什么大问题 - 所需的序列化数量很少,并且大多数系统没有足够的同时insert
操作,因此这是一个有意义的问题。但是,如果您拥有一个非常高容量的系统,特别是如果您在RAC集群上运行,那么这些等待事件可能是有意义的。如果遇到这种问题,生成随机密钥会通过使各种会话(通常)写入索引中的不同块来消除它。
当然,即使您发现自己经常等待索引的最右侧块,也不会生成随机密钥。 Oracle提供了反向键索引,通过反向索引数据来处理热块问题,从而在索引中的块之间分配I / O.如果您获得使用分区选项的许可,则散列分区索引会更好。有关reverse-key indexes, RAC, and mitigating hot block issues的更详细讨论,这里是指向相关SO问题的链接。