Sequential Guid相对于标准Guid的性能提升有哪些?当在数据库中用作主键时,有人曾测量过Sequential Guid与Standard Guid的性能吗?
3 回答
梵蒂冈之花
TA贡献1900条经验 获得超5个赞
我可能在这里遗漏了一些东西(如果我愿意,可以随意纠正我),但我可以看到使用顺序GUID / UUID作为主键的好处很少。
该点使用的GUID或UUID的在自动递增的整数是:
它们可以在任何地方创建而无需联系数据库
它们是在您的应用程序中完全唯一的标识符(在UUID的情况下,通用唯一)
给定一个标识符,没有办法猜测在暴力之外的下一个或前一个(甚至任何其他有效标识符) - 强制一个巨大的密钥空间。
不幸的是,使用你的建议,你会失去所有这些东西。
所以,是的。你已经使GUID变得更好了。但是在这个过程中,你几乎抛弃了几乎所有使用它们的理由。
如果您真的想提高性能,请使用标准的自动增量整数主键。这提供了您所描述的所有好处(以及更多),而几乎在所有方面都优于“顺序指导”。
这很可能会被遗忘,因为它没有专门回答你的问题(这显然是精心制作的,所以你可以立即自己回答),但我觉得这是一个更重要的一点。
慕森卡
TA贡献1806条经验 获得超8个赞
正如massimogentilini已经说过的,使用UuidCreateSequential时可以提高性能(在代码中生成guid时)。但似乎缺少一个事实:SQL Server(至少Microsoft SQL 2005/2008)使用相同的功能,但是:Guids的比较/排序在.NET和SQL Server上有所不同,这仍然会导致更多的IO,因为guid不会被正确订购。为了生成为sql server(订购)正确订购的guid,您必须执行以下操作(请参阅比较详细信息):
[System.Runtime.InteropServices.DllImport("rpcrt4.dll", SetLastError = true)]static extern int UuidCreateSequential(byte[] buffer);static Guid NewSequentialGuid() { byte[] raw = new byte[16]; if (UuidCreateSequential(raw) != 0) throw new System.ComponentModel.Win32Exception(System.Runtime.InteropServices.Marshal.GetLastWin32Error()); byte[] fix = new byte[16]; // reverse 0..3 fix[0x0] = raw[0x3]; fix[0x1] = raw[0x2]; fix[0x2] = raw[0x1]; fix[0x3] = raw[0x0]; // reverse 4 & 5 fix[0x4] = raw[0x5]; fix[0x5] = raw[0x4]; // reverse 6 & 7 fix[0x6] = raw[0x7]; fix[0x7] = raw[0x6]; // all other are unchanged fix[0x8] = raw[0x8]; fix[0x9] = raw[0x9]; fix[0xA] = raw[0xA]; fix[0xB] = raw[0xB]; fix[0xC] = raw[0xC]; fix[0xD] = raw[0xD]; fix[0xE] = raw[0xE]; fix[0xF] = raw[0xF]; return new Guid(fix);}
- 3 回答
- 0 关注
- 740 浏览
添加回答
举报
0/150
提交
取消