Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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的%pattern%搜索?_Sql Server_Performance - Fatal编程技术网

Sql server 如何加速类似SQL的%pattern%搜索?

Sql server 如何加速类似SQL的%pattern%搜索?,sql-server,performance,Sql Server,Performance,有没有什么方法可以加速下面这样的查询?我正在寻找的选项,这将需要对应用程序代码的最小更改 SELECT * FROM my_table WHERE some_column like '%my string%' ORDER BY some_column 导致减速的表有250万条记录,执行查询需要10秒。 执行计划显示99%的成本是索引扫描(非聚集),这是可以理解的,因为两侧都有带“%”的相似和模式。 如果末尾有“%”,则使用索引查找并立即执行查询 因此,我正在寻找类似于: 在表中添加某种

有没有什么方法可以加速下面这样的查询?我正在寻找的选项,这将需要对应用程序代码的最小更改

SELECT  *
FROM my_table 
WHERE some_column like '%my string%' 
ORDER BY some_column
导致减速的表有250万条记录,执行查询需要10秒。 执行计划显示99%的成本是索引扫描(非聚集),这是可以理解的,因为两侧都有带“%”的相似和模式。 如果末尾有“%”,则使用索引查找并立即执行查询

因此,我正在寻找类似于:

  • 在表中添加某种传统索引,可能不会 可能吗
  • 将该表和/或索引放入RAM sa的一种方法是 更快
  • 还有别的吗
我可以使用MS SQL 2012或2014,两者都是标准版

奖金问题


同样的查询是否可能在DB2数据库上瞬时执行?应用程序最初使用db2,但被迁移到MS SQL。

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

  • 使用以下公式为some_列添加一个持久化的计算列:REVERSE(some_列)以存储字符串的REVERSE
  • 在该列上添加索引
  • 在查询中使用
    一些列,如'my string%'或rev\u一些列,如REVERSE('%my string')
    。最好用查询前启动的变量替换REVERSE(“%my string”)

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

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

您可能希望重新讨论本文中的一些建议


祝你好运

您是否尝试过
FULL TEXT
search尽管要使用全文谓词而不是like,但全文搜索需要对代码进行更改。不可能,这将是一次完整扫描。如果删除前导百分号(如“字符串%”),则可以对其进行优化。如果你知道搜索是如何在树上工作的,你就会得到这个。引擎必须搜索所有节点。如果它是唯一的谓词,那么您将无能为力。为该列编制索引仍然是索引扫描,没有帮助。如果可以删除前导或尾随“%”,则有一些技巧。如果它不是唯一的谓词,则应尽可能减少它们的影响,以提高总时间。我无法删除前导或尾随“%”,如果删除,应用程序会以各种方式中断。那么,在RAM中有没有这样的选项,以便扫描速度更快呢?这似乎是一个有趣的想法,但不幸的是需要更改代码。这与这个问题也无关,这个问题既有前导通配符,也有尾随通配符。@MartinSmith,你看到我的where子句了吗?我已经考虑过这两种情况,如果不是,请解释一下,以便我能理解。op询问如何使用前导通配符和尾随通配符加速搜索。你的索引没有帮助。反向索引只会帮助查找像
%pattern
这样的模式,其中子字符串保证出现在字符串的末尾,而不是
%pattern%
,它可以出现在任何地方。你说得对!看起来这个问题没有答案