Oracle中的顺序(组合)GUIDs

6
我们正在将C# Guid.NewGuid()随机生成的guid生成器切换到顺序guid算法,该算法建议在此帖中使用。虽然这似乎对于MS SQL Server很有效,但我不确定对于Oracle数据库的影响,因为我们在其中将guid存储在raw(16)字段中。是否有人知道这个算法是否适用于为Oracle创建顺序guid以及为MS SQL Server创建顺序guid,或者应该使用其他变体。

谢谢!

2个回答

1

什么是不必要的索引碎片化?当然,GUID将会分散(碎片化)在可能数据的整个空间中。这就是GUID的作用。数据的碎片化是GUID算法的固有属性,无论是SQL Server还是Oracle数据库都必须处理。索引实现可以处理这一点,参见 -> http://en.wikipedia.org/wiki/B-tree - Oliver Michels
是的,我指的是COMB GUIDs(正如标题所述)。具体来说,我指的是NHibernate实现的顺序(comb)GUIDs(也在帖子中链接)。从该算法可以看出,位被特定地排序,以适用于MS SQL Server对于UNIQUEIDENTIFIER数据类型应用的排序算法。因此,为了重申我的问题(希望这次更清楚):在Oracle的raw(16)字段中,这样的数据将如何排序?由于.NET Guid.NewGuid()算法的位,值是否仍将以“随机”顺序排列,还是将按顺序排序? - Eyvind
@Oliver Michels:你有什么想法可以避免Oracle上的表/索引碎片化吗? - massimogentilini
我能想到的唯一应对表/索引碎片化的“策略”就是收集准确的表和索引统计信息。如果更新后的统计数据显示存在实际问题,则应重新组织索引。关键在于识别实际需要重新组织的重要性。 - Oliver Michels
显示剩余4条评论

1

当索引块已经“太满”无法再添加一个条目时,它会被分裂。

Oracle有两种路径,一种针对“顺序”类型的值进行优化,另一种针对“随机”类型的值进行优化。如果新条目要放在索引的最右端,则会进行90-10的分裂。如果它在中间某个位置,则会进行50-50的分裂。如果您想将“新”值聚集在一起以便于索引,则顺序值很有用。如果您希望它们分散(例如避免在“热”块上争用),则随机值很有用。

这种技术是否对Oracle“好”,取决于您试图解决什么问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接