在 SQL Server 中存储和处理 128 位值

VSB*_*VSB 1 database sql-server sqldatatypes

我将创建一个包含特定列的表,该列存储 128 位无符号值。

我有以下限制:

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

  2. 我应该插入时间开销较低的值。

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

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

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

根据这个答案,建议使用二进制[16]来存储128位值(不考虑约束)。

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

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

Dan*_*man 5

binary(16)是最适合 128 位无符号值的列数据类型,因为 SQL Server 没有 128 位无符号类型。与 . 相比,这将使存储和内存需求减少一半char(32)

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

在列上创建索引以避免全表扫描。

我应该插入时间开销较低的值。

上述索引会产生较小的插入性能成本,但可以通过运行时节省来抵消。

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

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

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

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

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

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

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
Run Code Online (Sandbox Code Playgroud)