讨论一下汉明距离在MSSQL中的海量数据快速查询方法

fandaye 2016-08-16 05:45:23
目前遇到问题了。想提升查询速度。
目前的数据库中有500万条数据
表结构如下:

CREATE TABLE [dbo].[hm_tb] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[hm1] [int] NULL ,
[hm2] [int] NULL ,
[hm3] [int] NULL ,
[hm4] [int] NULL
) ON [PRIMARY]
GO

其中hm1-hm4代表的是hash字符串。字符总长度为64位。分成4块来存储。
每个块存储16位长度的二进制数据。我表中转换为INT类型。

查询相关:
比如得到一个HASH为:1010100111100011010101010111110001110101100010110101001110011101
先分成4段:
1段:1010100111100011 = 43491
2段:0101010101111100 = 21884
3段:0111010110001011 = 30091
4段:0101001110011101 = 21405
每段为16位长度转化为对应的十进制

计算汉明距离的方法:

select * from hm_tb where bit_count(hm1^43491)+bit_count(hm2^21884)+bit_count(hm3^30091)+bit_count(hm4^21405)<=4


其中bit_count函数和MYSQL中的bit_count类似就是计算一个数字中二进制里面1的个数。

这样就可以得到相似度在93.7%以上的数据。

经计算500万条要1分多种才出结果。这时间太久了。
请问大家有没有好的解决方案。

先从表结构以及能用到的索引方面来讨论一下(貌似这种计算是全表扫描,没地方建索引)。
硬件方面暂时先不讨论。




...全文
284 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwfxgm 2016-08-17
  • 打赏
  • 举报
回复
听人做说。用oracle还可以提升性能一下。
fandaye 2016-08-16
  • 打赏
  • 举报
回复
8G内存的MSSQL2012版本,速度39秒。 太不理想了。
卖水果的net 2016-08-16
  • 打赏
  • 举报
回复
的确,多存一列数据出来,能够极大的提高查询速度,空间换时间,就是这个场景;
shoppo0505 2016-08-16
  • 打赏
  • 举报
回复
存储的时候可以对于每个保存bit_count(hm1^43491)保存一个int数值. 那对比的时候就不用转化了

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧