我在Microsoft SQL Server 2012数据库中存储了小于等于64位的固定大小的二进制散列,二进制散列的大小也可以是48位或32位,每个散列都有一个标识符Id
,表结构如下:
Id int NOT NULL PRIMARY KEY,
Hash binary(8) NOT NULL
我在Hash
列上创建了非聚集索引,以提高性能并快速查找散列。此外,我还尝试根据字节n
创建整数列而不是binary(n)
。例如,我将列类型从binary(4)
更改为int
。
列类型binary(8)
和bigint
上的索引之间或binary(4)
和int
之间是否存在差异?
将散列存储为整数以提高搜索性能是否合理?
1条答案
按热度按时间sxpgvts31#
实际上,索引被限制在一定的字节长度内,越小越有利于IO。一旦你有了感兴趣的值,使用convert(varbinary(25),Hash)语法在数据类型之间进行转换就足够容易了。你不想在查找记录时调用大量的转换。
如果存在差异,则可能是由于所使用的排序规则或统计信息所致,它们只表示两个值之间的值是大于、小于还是等于。统计信息使查询能够查看过去的许多值,因为它“知道”数据分布。
当你有一个很大的字符串并且你试图做类似于'%value'的查找时,索引并没有太大的好处。哈希应该是随机的。这意味着重点是比较的字节数来做出查询决定。越少越好。
每个数据库工程师都会告诉你的没有帮助但准确的cya,这取决于你应该测试它。