在 SQL 服务器中存储和处理 128 位值

storing and processing 128-bit values in SQL Server

我将创建一个 table 具有特定列的存储 128 位无符号值的列。

我有以下限制:

  1. 我应该在尽可能短的时间内查询此列以前的重复值(注意:这不是唯一性约束)。

  2. 我应该插入具有低时序开销的值。

  3. 记录数可能在几千万左右(例如90M)。

  4. 我想将列值显示为十六进制。

  5. 我想使用十六进制输入字符串查询列值。

根据这个answer,建议使用 binary[16] 来存储 128 位值(不考虑约束)。

所以我的问题是,对于我的列数据类型,哪种数据类型可以是 suitable? (字符(32),二进制(16),...)。

我目前正在使用 char(32) 以十六进制表示形式存储 128 位值,我想知道我是否可以提高数据库性能?我想由于数字是作为文本值存储和处理的,它会降低数据库查询性能,并且可能存在性能更好的数据类型。

binary(16) 是最适合 128 位无符号值的列数据类型,因为 SQL 服务器没有 128 位无符号类型。与 char(32).

相比,这会将存储和内存需求减少一半

I should query this column for previous duplicate values in shortest possible time (Note: this is not a uniqueness constraint).

在列上创建索引以避免完整 table 扫描。

I should insert values with low timing overhead.

上述索引有少量插入性能成本,但会被运行时节省的成本所抵消。

Number of records may be around tens of millions (e.g. 90M).

一个 100M 行 table 将只有几 GB(取决于行大小)并且如果使用 table 则可能会驻留在足够大小的 SQL 实例上经常。

I want to display the column value as hex.

与所有显示格式一样,这是一项最好在表示层中完成的任务,但也可以在 T-SQL 中完成。

I want to query the column value using hex input strings.

理想情况下,查询时应匹配列数据类型,但如果需要,可以将十六进制字符串显式转换为二进制。

示例 T-SQL:

CREATE TABLE dbo.YourTable (
      YourTableID int NOT NULL CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED
    , BinaryValue binary(16) NOT NULL INDEX idx_BinaryValue NONCLUSTERED
    , OtherData varchar(50) NOT NULL
);
INSERT INTO dbo.YourTable VALUES(1,0X000102030405060708090A0B0C0D0E0F,'example 1');
INSERT INTO dbo.YourTable VALUES(2,0X000102030405060708090A0B0C0D0E00,'example 2');
INSERT INTO dbo.YourTable VALUES(3,0X000102030405060708090A0B0C0D0E0F,'example 3 duplicate value');

--example query values
DECLARE @BinaryValue binary(16) = 0X000102030405060708090A0B0C0D0E0F;
DECLARE @CharValue char(32) = '000102030405060708090A0B0C0D0E0F';

--matching type query
SELECT YourTableID, BinaryValue, OtherData, CONVERT(char(16), BinaryValue, 2) AS DisplayValue
FROM dbo.YourTable
WHERE BinaryValue = @BinaryValue;

--query with hex string
SELECT YourTableID, BinaryValue, OtherData, CONVERT(char(16), BinaryValue, 2) AS DisplayValue
FROM dbo.YourTable
WHERE BinaryValue = CONVERT(binary(16), @CharValue, 2);
GO