当在数据库中用作主键时,有人曾测量过Sequential Guid与Standard Guid的性能吗?
我有一个数据库,其中2(或3或4)个不同的应用程序正在插入信息.新信息具有GUID/UUID类型的ID,但每个应用程序使用不同的算法来生成ID.例如,一个使用NHibernate的"guid.comb",另一个使用SQLServer的NEWID(),其他人可能想使用.NET的Guid.NewGuid()实现.
是否存在ID碰撞或重复的正常风险?
谢谢!
我在asp.net mvc上做一个web应用程序,我在我的实体的long和Guid数据类型之间做出选择,但我不知道哪个更好.有人说长得多快.Guid也可能有一些优势.有人知道吗?
对于我的项目,这是一个潜在的大型网站,我选择将命令界面与查询界面分开.因此,提交命令是单向操作,不会返回结果.这意味着客户端必须提供密钥,例如:
service.SubmitCommand(new AddUserCommand() { UserId = key, ... });
Run Code Online (Sandbox Code Playgroud)
显然我不能使用int作为主键,所以Guid是一个合乎逻辑的选择 - 除了我到处读到它对性能的影响,这让我感到害怕:)
但后来我也读到了关于COMB Guids,以及它们如何提供Guid的优势,同时仍然具有良好的性能.我还在这里找到了一个实现:Linq-to-Sql中的顺序GUID?.
所以在我做出这个重要决定之前:有人有这方面的经验吗?
非常感谢!
路德
我们是从C#Guid.NewGuid()随机十岁上下的GUID生成器中所建议的顺序GUID算法切换过程这篇文章.虽然这似乎适用于MS SQL Server,但我不确定对Oracle数据库的影响,我们将guids存储在raw(16)字段中.有没有人知道这个算法是否适合为Oracle和MS SQL Server创建顺序guid,或者是否应该使用不同的变体.
谢谢!
我们有一个包含500多个表的数据库,其中几乎所有表都有一个数据类型为guid(uniqueidentifier)的聚簇PK.
我们正在测试从通过.NET Guid.NewGuid()方法生成的"正常""随机"guid到通过NHibernate guid.comb算法生成的顺序guid的转换.这看起来效果很好,但是那些已经拥有数百万行"随机"主键值的客户呢?
在此先感谢您的任何指示.
我们有一个数据库,其中所有PK都是GUID,大多数PK也是表的聚簇索引.我们知道这很糟糕(由于GUID的随机性).因此,似乎这里基本上有两个选项(完全没有将GUID作为PK扔掉,这是我们做不到的(至少目前不是这样)).
是否有可能在这种情况下提供任何一般性建议?
该应用程序有500多个表,最大的一个目前约150万行,几个表约50万行,其余表显着较低(大多数低于10K).
此外,该应用程序已安装在多个客户站点,因此我们必须考虑现有客户的任何可能的负面影响.
谢谢!
我陷入了混乱,想看看我是否可以摆脱它.我有一个数据库,其中包含在uniqueidentifier列上定义的表上的所有主键.这有点强加于我们,将"安全"作为其中一个原因.另一个我认为比较有价值的原因是有些表参与复制.
我正在审查数据库,我觉得一个容易避免的未来性能瓶颈是可能在所有表中添加自动增量bigint列并使它们成为主键(群集).并以某种方式'正确地'附加'pk-fk关系.但仍保留旧列以供将来使用.
有关这方面的任何建议/意见/建议吗?我们是ac#/ MSSQL Server R2/Linq环境.
编辑: 看看评论,我意识到我遗漏了一些重要的细节.所有主键Guid字段都是Clustered,我不使用newsequentialId(我们使用Linq to SQL,主键是客户端生成的.由于涉及复制,我们不确定如何从不同的客户端环境正确生成顺序ID冲突).
我的"感觉"是由于已知的事实,guid列上的聚簇索引将导致高度碎片,并且只会随着数据库的增长而恶化这种情况.
此外,我现在并没有真正尝试优化,而是尝试纠正一个糟糕的设计,以避免在数据库变得太大时未来的麻烦.想知道现在是否值得这样做.
guid ×7
sql-server ×5
c# ×4
sequential ×2
.net ×1
cqrs ×1
database ×1
entity ×1
key ×1
long-integer ×1
oracle ×1
performance ×1
primary-key ×1
uuid ×1