Alexander Petrov Asked:2020-04-26 19:44:05 +0800 CST2020-04-26 19:44:05 +0800 CST 2020-04-26 19:44:05 +0800 CST 什么是串行 GUID? 772 除了常规GUID之外,还有顺序GUID。 特别是,它们可以用作数据库中的键。 这些是什么? 与传统的相比,它们有哪些优势和劣势? sql 1 个回答 Voted Best Answer Богдан Соловьев 2020-09-13T15:58:31+08:002020-09-13T15:58:31+08:00 我的 GUID 与顺序 GUID 的免费翻译 经典模式是使用 Guid 作为主键 (PK),但正如在各种讨论中提到的,参见 GUID / UUID 数据库键的优缺点,存在一些性能问题。 这是 Guid 的通常顺序 f3818d69-2552-40b7-a403-01a6db4552f7 7ce31615-fafb-42c4-b317-40d21a6a3c60 94732fc7-768e-4cf2-9107-f0953f6795a5 此类数据的问题: 范围广泛的值 几乎是随机值 索引的困难 “很多叶子移动” *我相信作者指的是数据库中的索引结构。当随机值很多时,索引树过于扁平,叶子节点很多(没有子节点)。此类索引会降低性能。 几乎每个 PK 都应该至少有一个非聚集索引。 Oracle 和 SQL Server 都会出现此问题。 一种可能的解决方案是使用按如下方式生成的 Sequential Guid: cc6466f7-1066-11dd-acb6-005056c00008 cc6466f8-1066-11dd-acb6-005056c00008 cc6466f9-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; } 优点: 更好的索引性能 允许聚集索引 更少的存储使用量 以最低成本提高 20-25% 的性能 现实生活中的测量。设想: Guid 在 SQL Server 中存储为 UniqueIdentifier 类型。Guid 在 Oracle 上存储为 CHAR(36)。许多插入操作组合成一个事务。从 1 到 100 次插入,具体取决于表。一些表有 > 1000 万行。 实验室测试 - SQL Server VS2008测试,10个并发用户,无延迟,叶表600次插入的测试过程(无子表) 常规指导 平均。处理持续时间:10.5 秒 平均。第二次请求: 8 月54.6 日。响应。时间:0.26 顺序指南 平均 过程持续时间:4.6 秒 第二次请求:87.1 八月。响应。时间:0.12 Oracle 1.327.613 上的结果插入到带有 Guid PK 的表中 正常引导,0.02 秒。一次插入需要 2.861 秒。CPU 时间,总计 31.049 秒。花了 顺序引导,0.00 秒。一次插入需要 1.142 秒。CPU 时间,总计 31.049 秒。花了 从 BD 顺序读取文件。 它是:640 万次延迟和 62.415 秒。 现在:120 万次延迟和 11.063 秒。 重要的是要了解所有顺序指南都可以猜到,如果安全性对您很重要,请不要使用它们。
我的 GUID 与顺序 GUID 的免费翻译
经典模式是使用 Guid 作为主键 (PK),但正如在各种讨论中提到的,参见 GUID / UUID 数据库键的优缺点,存在一些性能问题。
这是 Guid 的通常顺序
此类数据的问题:
范围广泛的值
几乎是随机值
一种可能的解决方案是使用按如下方式生成的 Sequential Guid:
如何从 C# 代码生成它们:
优点:
现实生活中的测量。设想:
Guid 在 SQL Server 中存储为 UniqueIdentifier 类型。Guid 在 Oracle 上存储为 CHAR(36)。许多插入操作组合成一个事务。从 1 到 100 次插入,具体取决于表。一些表有 > 1000 万行。
实验室测试 - SQL Server
VS2008测试,10个并发用户,无延迟,叶表600次插入的测试过程(无子表)
常规指导
平均。处理持续时间:10.5 秒
平均。第二次请求:
8 月54.6 日。响应。时间:0.26
顺序指南
平均 过程持续时间:4.6
秒 第二次请求:87.1
八月。响应。时间:0.12
Oracle 1.327.613 上的结果插入到带有 Guid PK 的表中
正常引导,0.02 秒。一次插入需要 2.861 秒。CPU 时间,总计 31.049 秒。花了
顺序引导,0.00 秒。一次插入需要 1.142 秒。CPU 时间,总计 31.049 秒。花了
从 BD 顺序读取文件。
它是:640 万次延迟和 62.415 秒。
现在:120 万次延迟和 11.063 秒。
重要的是要了解所有顺序指南都可以猜到,如果安全性对您很重要,请不要使用它们。