类似%的SQL Server性能提示

时间:2014-03-04 07:14:14

标签: sql-server performance sql-like

我有一张包含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

请原谅我的伪代码,如果它不正确,因为这更像是一个事实发现任务 但我觉得我在球场

注意:我不认为任何索引可以在这里提供帮助,不过基于内存的表我猜测会加快这个速度

有人能想出解决问题的更好方法吗?任何建议或意见将不胜感激,谢谢

4 个答案:

答案 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上的前四个字符执行范围搜索,并在残差谓词中使用Field1Field2的完整比较。

enter image description here

答案 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中尝试此方法时,应包括查询计划。查询计划将为您提供有关如何组织索引的一个很好的提示。