集群 GUID 与 BIGINT 身份 PK 的十六进制密钥(最佳性能)- SQL Server 2008

Hexadecimal key to clustered GUID vs BIGINT identity PK's (Best Performance) - SQL Server 2008

我目前正在集成 API 密钥验证,我使用几个不同的数据点(电子邮件+时间等)生成了一个小的唯一(到目前为止)十六进制字符串的密钥,即“7edbf060”(这无法更改,因为许多键已经用完了)我希望将这些键 convert/store 转换为 GUID 或 BIGINT,以便在 [=41] 上更快 indexing/searching =],因为这将以每秒约 300-500 次的速度访问(目前每天有 4000 万多个请求),因此性能是这里的一个重要因素!

显然,将十六进制键保留为 VARCHAR 列并对其执行搜索效率非常低!所以我的想法是,一旦用户发送了他们的密钥,我就可以将其转换为其他内容 (GUID/BIGINT) 并以这种方式执行我的查找。

SELECT CONVERT(uniqueidentifier, 0x7edbf060)
--output: 60F0DB7E-0000-0000-0000-000000000000

SELECT CONVERT(bigint, 0x7edbf060)
--output: 2128343136

由于键是非顺序生成的,索引必须聚集并且会变得碎片化,但我有脚本可以全天重新排列这些 tables 以控制它。

所以我想 table 这样的: [GUID] (uniqueidentifier, PK, not null), [Key] (varchar(8)), [Email] (varchar(max))

这些是我的 only/best 选项吗?我担心的是十六进制密钥一旦转换为 SQL 中的 uniqueindentifier 似乎只使用前 8 个字符后跟“-0000-0000-0000-000000000000”,一旦转换为 bigint 值已经在20 亿个范围,并且不知道一旦有几千条范围遍布各处的记录,这两个选项将如何执行。

任何 help/advice 将不胜感激!谢谢

我建议您将其本地存储为 binary(4) 数据类型,因为这是源数据的实际类型。二进制列可以是主键列或适当索引。正确的数据类型是最适合存储数据域的数据类型。即使是要求最苛刻的应用程序也很少考虑数据类型性能。

从性能的角度来看,只要 table 足够小,我希望即使在适度的硬件上每秒也可以实现数千个 select 请求(假设返回一行)保留在缓冲区缓存中。只要数据在内存中,碎片化也不是单例请求的考虑因素。只有在达到影响缓冲区效率的程度时,碎片才会影响随机请求的性能。

对于 table 太大而无法留在缓冲区缓存中的情况,随机密钥将需要物理 I/O 与非缓存差异成比例。您需要一个存储子系统,能够满足 I/O 对具有大 table.

的随机密钥的需求

你提到了搜索。如果这些需要 table 扫描而不是点查找,则根据 table 大小实现性能目标可能会有问题。指定插入率和预期 table 大小。