与标准Guid相比,顺序Guid在性能上有哪些改进? [关闭]

问题描述 投票:68回答:8

有人在用作数据库内的主键时曾经测量过顺序向导与标准向导的性能吗?


我看不到是否需要唯一键,从Web UI或其他部分传递它们本身似乎是一种不好的做法,如果您有安全方面的问题,我不知道如何使用GUID。可以改善情况(如果这是问题,请使用使用框架的适当加密功能的真实随机数生成器)。我的方法涵盖了其他项目,可以从代码生成顺序的guid,而无需DB访问(即使仅对于Windows),并且在时间和空间上是唯一的。是的,提出这个问题的目的在于回答那些选择了Guid作为其PK的人们以改善数据库使用率的方式(在我的情况下,这使客户能够承受更大的工作量而不必更换服务器)。看来,安全性问题很多,在这种情况下,请不要使用Sequential Guid,或者最好不要使用标准GUId作为PK,这些PK是从UI来回传递的,而sequential guid用于其他所有操作。一如既往没有绝对的真理,我也编辑了主要答案来反映这一点。

database primary-key guid
8个回答
108
投票

GUID与顺序GUID

一种典型的模式是将Guid用作表的PK,但是,如其他讨论中所提及(请参见Advantages and disadvantages of GUID / UUID database keys)有一些性能问题。这是典型的Guid序列

f3818d69-2552-40b7-a403-01a6db4552f77ce31615-fafb-42c4-b317-40d21a6a3c6094732fc7-768e-4cf2-9107-f0953f6795a5这种数据的问题是:

  • 值的广泛分布
  • 几乎随机地
  • 索引使用非常非常非常糟糕
  • 很多叶子在移动
  • 几乎每个PK至少需要在非聚集索引上]
  • 问题在Oracle和SQL Server
  • 可能的解决方案是使用顺序引导,其生成如下:cc6466f7-1066-11dd-acb6-005056c00008cc6466f8-1066-11dd-acb6-005056c00008cc6466f9-1066-11dd-acb6-005056c00008

如何从C#代码生成它们:

[DllImport("rpcrt4.dll", SetLastError = true)]
static extern int UuidCreateSequential(out Guid guid);

public static Guid SequentialGuid()
{
    const int RPC_S_OK = 0;
    Guid g;
    if (UuidCreateSequential(out g) != RPC_S_OK)
        return Guid.NewGuid();
    else
        return g;
}

好处

  • 更好地使用索引
  • 允许使用群集键(已在NLB场景中验证)
  • 减少磁盘使用量
  • 一次提升20-25%的效能最低费用
  • 现实生活中的测量:

场景:
  • 向导存储为UniqueIdentifierSQL Server上的类型]
  • 向导在Oracle上存储为CHAR(36)的向导
  • 很多插入操作,批量一起进行一次交易
  • 从1到100s取决于在桌子上
  • 某些表>一千万行
  • 实验室测试– SQL ServerVS2008测试,10个并发用户,没有思考时间,基准测试过程,分批插入600个叶表标准向导

平均处理持续时间:10.5秒平均请求第二个:54.6平均分别时间:0.26顺序向导平均处理持续时间:4.6秒平均请求第二个:87.1平均分别时间:0.12Oracle的结果(抱歉,用于测试的其他工具)1.327.613插入带有Guid PK的表上标准引导0.02秒。每个插入所用的时间,2.861秒。 CPU时间总计31.049秒。过去顺序引导0.00秒。每个插入所用的时间,1.142秒。 CPU时间总计3.667秒。过去DB文件顺序读取等待时间从6.4百万个等待事件(62.415秒)变为1.2百万个等待事件(11.063秒)。重要的是要知道所有顺序guid都能被猜到,因此,如果出于安全考虑,最好还是使用标准guid来使用它们。简而言之...如果您将Guid用作PK,则每次不从UI来回传递它们时都使用顺序guid,它们将加快操作速度,并且无需花费任何实现成本。

57
投票

我可能在这里丢失了一些东西(如果可以的话,请随时纠正我,但是我发现对主键使用顺序的GUID / UUID几乎没有好处。


23
投票
正如massimogentilini所说,使用UuidCreateSequential(在代码中生成引导时,可以提高性能。但是似乎缺少一个事实:SQL Server(至少是Microsoft SQL 2005/2008)使用相同的功能,但:.NET和SQL Server上Guid的比较/顺序不同,这仍然会导致更多的IO,因为Guids将无法正确订购。为了生成正确排序的sql服务器guid(排序),您必须执行以下操作(请参阅comparison详细信息):


4
投票
如果您

需要


3
投票
由Jimmy Nilsson签出COMBs:一种GUID,其中许多位已被类似时间戳的值替换。这意味着可以对COMB进行排序,并且当用作主键时,插入新值时可以减少索引页的拆分。

3
投票
我使用实体框架弄清了Guid(群集和非群集),顺序Guid和int(身份/自动增量)之间的差异。与具有标识的int相比,Sequential Guid出奇地快。 Results and code of the Sequential Guid here

2
投票
确定,我终于在设计和生产上达到了这一点。
© www.soinside.com 2019 - 2024. All rights reserved.