我有一张包含5到10百万条记录的表,其中包含2个字段
示例数据
Row Field1 Field2
------------------
1 0712334 072342344
2 06344534 083453454
3 06344534 0845645565
给出2个变量
variable1 : 0634453445645
variable2 : 08345345456756
我需要能够尽快查询表格以获得最佳匹配
以上示例将生成1条记录(例如第2行)
查询数据库匹配的最快方法是什么?
注意:数据和变量始终采用此格式(即始终为数字,可能有也可能没有前导零,字段不是唯一的,但两者的组合将会是)
我最初的想法是做这样的事情
Select blah where Field1 + "%" like variable1 and Field2 + "%" like variable2
请原谅我的伪代码,如果它不正确,因为这更像是一个事实发现任务 但我觉得我在球场
注意:我不认为任何索引可以在这里提供帮助,不过基于内存的表我猜测会加快这个速度
有人能想出解决问题的更好方法吗?任何建议或意见将不胜感激,谢谢
答案 0 :(得分:1)
您可以通过Field1
获取有关此类查询的索引的计划。
declare @V1 varchar(20) = '0634453445645'
declare @V2 varchar(20) = '08345345456756'
select Field1,
Field2
from YourTable
where Field1 like left(@V1, 4) + '%' and
@V1 like Field1 + '%' and
@V2 like Field2 + '%'
它对Field1
上的前四个字符执行范围搜索,并在残差谓词中使用Field1
和Field2
的完整比较。
答案 1 :(得分:0)
没有性能提示。就像那样。
%somethin%是表扫描,由于开头%,因此未使用指数。富文字索引不会起作用,因为它不是你所寻求的全文,而是一个单词的一部分。
获得更快的机器来处理表扫描和非规范化是您唯一能做的事情。在一台体面的计算机上应该有足够的5-10万行。不需要基于内存的表 - 只需足够的RAM来缓存该表。
这就是它。要么找到摆脱初始%的方法,要么快速获得硬件(主要是内存)来处理这个问题。
OR - 处理它的OUTSIDE sql server。将500万到1000万行加载到搜索服务中并使用更好的数据结构。通用的SQL必须做出妥协。但同样,部分匹配将杀死大多数方法。
答案 2 :(得分:0)
Postgres有三元组索引http://www.postgresql.org/docs/current/interactive/pgtrgm.html
也许SQL Server有这样的东西?
答案 3 :(得分:0)
列'Field1'和'Field2'的最短长度是多少?将此号码称为“N”。
然后创建一个select语句,该语句要求从长度为N的第一个字符开始的所有子字符串到每个变量的长度。示例(例如,N = 10)
select distinct * from myTable
where Field1 in ('0634453445','06344534456','063445344564', '0634453445645')
and Field2 in ('0834534545','08345345456','083453454567', '0834534545675','08345345456756')
编写一个小脚本,为您创建查询。当然还有更多优化,但这需要(imho)改变你的表结构,我可以想象这是你不想要的东西。至少你可以试一试。
此外,在SSMS中尝试此方法时,应包括查询计划。查询计划将为您提供有关如何组织索引的一个很好的提示。