如何加速像%pattern%搜索的SQL?

时间:2016-04-20 18:02:09

标签: sql-server performance

有没有办法加快下面这样的查询?我正在寻找需要对应用程序代码进行最小更改的选项。

SELECT  *
FROM my_table 
WHERE some_column like '%my string%' 
ORDER BY some_column

导致大部分减速的表有250万条记录,查询需要10秒才能执行。 执行计划告诉99%的成本是索引扫描(NonClustered),这是可以理解的,因为LIKE和模式两边都有“%”。 如果最后只有“%”,则使用索引查找并立即执行查询。

所以我正在寻找类似的东西:

  • 在表上添加某种aditional索引,可能不是 可能?
  • 将此表和/或索引放入RAM中的方法是搜索 更快
  • 其他什么?

我可以使用MS SQL 2012或2014,两者都是标准版。

加分问题

这个相同的查询是否有可能在DB2数据库上执行不正常?应用程序最初使用的是db2,但已迁移到MS SQL。

2 个答案:

答案 0 :(得分:0)

可能没有答案,但有一个原因。当您使用带有前导通配符的搜索字符串(例如'%string')时,您将强制优化器执行表扫描。

您可能想重新审视此主题中的一些建议。

祝你好运!

答案 1 :(得分:-2)

我不确定此解决方案是否适合您,因为它会在数据库中存储更多数据。它也可能会增加更新/插入的时间,但无论如何它都是一个想法。太长时间没有评论,所以不要怪我!

  • 使用以下公式为some_column添加持久计算列:REVERSE(some_column)以存储字符串的反向
  • 在该列上添加索引
  • 在您的查询中使用some_column like 'my string%' or rev_some_column like REVERSE('%my string')。您最好使用在查询之前启动的变量替换REVERSE('%my string')。

我认为在这种情况下,两个人都喜欢使用索引。