Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server性能提示,如%_Sql Server_Performance_Sql Like - Fatal编程技术网

Sql server SQL Server性能提示,如%

Sql server SQL Server性能提示,如%,sql-server,performance,sql-like,Sql Server,Performance,Sql Like,我有一个包含500-1000万条记录的表,其中有两个字段 示例数据 Row Field1 Field2 ------------------ 1 0712334 072342344 2 06344534 083453454 3 06344534 0845645565 给定2个变量 variable1 : 0634453445645 variable2 : 08345345456756 我需要能够查询表中的最佳匹配尽可能快 上述示例将生成1条记录(例如第2行) 查询数

我有一个包含500-1000万条记录的表,其中有两个字段

示例数据

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
如果我的伪代码不正确,请原谅,因为这更像是一个事实调查任务。不过我想我是在球场上

注意:我认为任何索引在这里都没有帮助,尽管我猜基于内存的表会加快速度


有人能想出更好的解决问题的方法吗?

没有性能提示。就这么简单

%somethin%是表扫描,由于开始%而未使用索引。full-ltext索引将不起作用,因为它不是您要查找的全文,而是单词的一部分

让一台更快的机器处理表格扫描和非规范化是你唯一能做的事情。在一台像样的计算机上,500-1000万行应该足够快。不需要基于内存的表-只需要足够的RAM来缓存该表

差不多就是这样。要么找到摆脱初始%的方法,要么以足够快的速度获得硬件(主要是内存)来处理此问题


或者-在sql server外部处理它。将500-1000万行加载到搜索服务中,并使用更好的数据结构。通用SQL必须做出妥协。但同样,部分匹配将扼杀绝大多数方法。

Postgres有三元索引


也许SQL Server有类似的功能?

列“Field1”和“Field2”中最短的长度是多少?打这个号码“N”

然后创建一个select语句,该语句要求从长度为N的第一个字符开始到每个变量的长度的所有子字符串。示例(例如,N=10)

编写一个小脚本,为您创建查询。当然还有很多需要优化的地方,但这需要(imho)更改表的结构,我可以想象这是您不想要的。至少你可以试一试


此外,在SSMS中尝试这种方法时,应该包括查询计划。查询计划将为您提供一个关于如何组织索引的好提示。

您可以在
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
上的完整比较


谢谢或您的回复,幸运的是我只需要一些我认为更快的%的东西,但是我认为由于数据的性质,我可能能够使用反向整数(不要问我如何)或其他方法。虽然我有点期待这样的答案,但再次感谢他并不是要求进行'%foo%'搜索,而是要求进行某种'reversed start with'。所以我想这是一个优化的可能性。我曾经在一个SQL Server上尝试过3-gram,在一个包含600万行音乐标题和歌手/乐队名称的表上。生成的Trigram表包含大约1亿个条目,搜索非常困难。我切换到全文。但是,在这种情况下,这并不合适。有趣的是,我不确定trigram是否最适合解决这个问题,即使它是在SQl Server中实现的,感谢您的输入。Hrm,最短的组合是4个字符,最长的大约是9个,我肯定可以做一些基准测试,看看这是否能提高性能,我会使用linq,所以这很容易实现。我猜哇,这就是我一直在寻找的智能,你认为这与alzaimars答案相比(性能)会如何?@Saruman你必须在数据上进行测试。我确实认为我的查询更容易构建,因为您不必使用传入变量生成in子句。我非常喜欢您的方法。多亏了这个解决谜题的新想法。虽然所有的答案都帮了我的忙,但我认为@Mikael Eriksson的答案在这个阶段最接近我,通过思考计划和通过SQL tuning advisor编制索引
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 + '%'