Sequential Guid相对于标准Guid的性能提升有哪些?

Sequential Guid相对于标准Guid的性能提升有哪些?

当在数据库中用作主键时,有人曾测量过Sequential Guid与Standard Guid的性能吗?



繁星coding
浏览 741回答 3
3回答

梵蒂冈之花

我可能在这里遗漏了一些东西(如果我愿意,可以随意纠正我),但我可以看到使用顺序GUID / UUID作为主键的好处很少。该点使用的GUID或UUID的在自动递增的整数是:它们可以在任何地方创建而无需联系数据库它们是在您的应用程序中完全唯一的标识符(在UUID的情况下,通用唯一)给定一个标识符,没有办法猜测在暴力之外的下一个或前一个(甚至任何其他有效标识符) - 强制一个巨大的密钥空间。不幸的是,使用你的建议,你会失去所有这些东西。所以,是的。你已经使GUID变得更好了。但是在这个过程中,你几乎抛弃了几乎所有使用它们的理由。如果您真的想提高性能,请使用标准的自动增量整数主键。这提供了您所描述的所有好处(以及更多),而几乎在所有方面都优于“顺序指导”。这很可能会被遗忘,因为它没有专门回答你的问题(这显然是精心制作的,所以你可以立即自己回答),但我觉得这是一个更重要的一点。

慕森卡

正如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);}或此链接或此链接。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

SQL Server