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

Posted

技术标签:

【中文标题】在 SQL Server 中存储和处理 128 位值【英文标题】:storing and processing 128-bit values in SQL Server 【发布时间】:2021-12-04 04:34:32 【问题描述】:

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

我有以下限制:

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

    我应该插入具有低计时开销的值。

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

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

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

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

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

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

【问题讨论】:

如果这是推荐的解决方案,您为什么使用binary?在 char 中存储一个十六进制值没有什么意义,因为二进制也被字面上显示为一个十六进制值。 当您建议将二进制值存储在二进制数据类型中时,您会回答自己的问题。您是否使用自己的解决方案进行过任何测试?你有没有发现什么困难或问题?询问那些具体的问题,而不是抽象的问题。 【参考方案1】:

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

【讨论】:

以上是关于在 SQL Server 中存储和处理 128 位值的主要内容,如果未能解决你的问题,请参考以下文章

内联汇编代码和存储 128 位结果

sql server 2005 2709 出错 是啥意思

如何在 MySQL 的单列中存储 128 位数字?

sql server控制小数显示位数的解决办法。

sql server中怎样创建保存数据的存储过程

在 SQL Server 中屏蔽信用卡号