有什么方法可以提高搜索值左侧有 % 的类似搜索的性能吗?

Ste*_*n M 4 sql-server string-searching query-performance

我有一个查询,它对存储计算机上文件的完整路径位置的列执行类似的语句。

例子

select * 
from table 
where fullpath like '%hi.exe'
Run Code Online (Sandbox Code Playgroud)

这似乎从未使用索引,并且与执行 fullpath = 'value' 相比非常慢(显然)

但我的问题是,有没有什么方法或想法可以加快查询结果或让它使用索引?

如果右侧有类似的内容,我不会看到同样的缓慢(例如 select * from table where fullpath like 'hi%'

编辑:Microsoft Sql server 2017 标准版

J.D*_*.D. 9

FWIW,我不认为之前提供的重复问题实际上是这个特定问题的重复,而是回答了一个更复杂的切向相关问题,即如何使用双通配符改进搜索(包含搜索类型)。有些答案可能也适用于这里,但对于这个更简单的问题来说过于复杂,因此我投票重新提出问题。我尝试使用更简单的解决方案找到合适的重复项,但找不到。


有什么方法可以提高搜索值左侧有 % 的类似搜索的性能吗?

假设您确实严格意味着仅开始搜索类型(仅前导通配符)并且不包含搜索类型,那么有一些相当简单的解决方案。

一种解决方案涉及存储反转列的副本(计算列可以在此处提供帮助),然后在反转列上创建索引。然后,您可以反转通配符顺序,使其成为针对反转列的结尾搜索。这在逻辑上是等效的并且也是可控制的,因此允许以有效的方式使用索引。

示例代码:

-- Step 1: Add a computed column with the reversed column
ALTER TABLE YourTable
ADD fullpath_reversed AS REVERSE(fullpath);

-- Step 2: Index the newly created reversed column 
CREATE NONCLUSTERED INDEX IX_YourTable_fullpath_reversed ON YourTable (fullpath_reversed);

-- Step 3: Query the newly created column efficiently 
select * 
from YourTable 
where fullpath_reversed like 'exe.ih%';
Run Code Online (Sandbox Code Playgroud)

请注意,您不应SELECT *在任何非临时代码中使用,尤其是当您担心性能时。仅列出您对该特定查询真正关心的列。它的性能更高,因为读取的数据少于必要的数据,并且通过选择索引和使用索引操作可能会产生更好的查询计划。


小智 6

如果您通常搜索文件名,请将它们单独存储而不是嵌入到fullpath.

根据查询单独存储路径、文件名和扩展名可能会更好。

Will use less space than a reversed copy of the fullpath.