为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁星coding 2019-08-16 15:33:50
Sequential Guid相对于标准Guid的性能提升有哪些?当在数据库中用作主键时,有人曾测量过Sequential Guid与Standard Guid的性能吗?
查看完整描述

3 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

我可能在这里遗漏了一些东西(如果我愿意,可以随意纠正我),但我可以看到使用顺序GUID / UUID作为主键的好处很少。

使用的GUID或UUID的在自动递增的整数是:

  • 它们可以在任何地方创建而无需联系数据库

  • 它们是在您的应用程序中完全唯一的标识符(在UUID的情况下,通用唯一)

  • 给定一个标识符,没有办法猜测在暴力之外的下一个或前一个(甚至任何其他有效标识符) - 强制一个巨大的密钥空间。

不幸的是,使用你的建议,你会失去所有这些东西。

所以,是的。你已经使GUID变得更好了。但是在这个过程中,你几乎抛弃了几乎所有使用它们的理由。

如果您真的想提高性能,请使用标准的自动增量整数主键。这提供了您所描述的所有好处(以及更多),而几乎在所有方面都优于“顺序指导”。

这很可能会被遗忘,因为它没有专门回答你的问题(这显然是精心制作的,所以你可以立即自己回答),但我觉得这是一个更重要的一点。


查看完整回答
反对 回复 2019-08-16
?
慕森卡

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);}

此链接此链接


查看完整回答
反对 回复 2019-08-16
  • 3 回答
  • 0 关注
  • 740 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信