首页 > 解决方案 > SQL Server 中的大整数键

问题描述

我需要创建一个带有 256 位哈希数的键的表。快速搜索和检索至关重要,所以我想知道使用什么数据结构作为 key ?

一种选择是 varchar[32],但我想搜索会很慢。存储的数据量将远高于数值解。

第二个选项是两个不同的十进制 [16] 整数并将它们组合成一个复合键,但我怀疑这是否会比选项 #1 具有更快的搜索性能。

我用谷歌搜索了那个主题,但没有找到解决方案;也许是第三种选择?任何提示表示赞赏。

标签: sql-servertypesinteger

解决方案


如果可能的话,最好是PRIMARY KEY一个表作为代理键和一个数字。使用SMALLINT, ``INTBIGINTIDENTITY应用。使用这样的定义:

[RowID] INT IDENTITY(1,1)

将帮助您解决一些常见问题 - 最重要的是,当创建新记录时,它们将附加在最后一个索引页面的末尾,因此插入时不会出现页面拆分/碎片。

可以添加其他列 - 您的哈希值,您可以在其上创建索引,以更快地通过哈希进行搜索。

例如,我有一个 IP 地址表,其中包含应用程序中使用的所有地址(基本上是用户用于登录的地址)。

该表如下所示:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[IPAddresses]
(
     [IPAddressID] BIGINT IDENTITY(10000,1) NOT NULL
    ,[IPAddress] VARBINARY(84) NOT NULL
    ,[IPAddressHash] VARBINARY(64) NULL
    ,CONSTRAINT [PK_IPAddresses] PRIMARY KEY
     (
        [IPAddressID] ASC
     )
    ,INDEX [IX_IPAddresses_IPAddressHash] 
    (
        [IPAddressHash] ASC
    )
)
GO

由于IPAddress是个人数据,因此应加密。因为我希望我的数据被规范化并且我不想有重复的记录,所以我需要在每次用户登录时检查地址是否存在 - 如果不存在,则创建一个。我正在使用以下例程执行此操作:

在此处输入图像描述

在这里,我传递地址并计算我正在搜索的哈希值。最初的版本是使用哈希来解密所有值并通过文本搜索,但是对于数百万个 IP,这非常慢,并且该例程不断执行。另一方面,我只在此表中执行插入操作,并且只附加记录 - 所以根本没有碎片。

所以,我的建议是:

  1. 使用带有标识的数字列作为主键
  2. 添加表中的其余列
  3. 添加哈希列并按用于搜索的列构建哈希
  4. 在这个哈希列上创建索引
  5. 然后当您需要搜索记录时使用哈希,找到PKID然后使用ID提取记录

推荐阅读