在 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 位值的主要内容,如果未能解决你的问题,请参考以下文章