我有一个查询,它对存储计算机上文件的完整路径位置的列执行类似的语句。
例子
select *
from table
where fullpath like '%hi.exe'
这似乎从未使用索引,并且与执行 fullpath = 'value' 相比非常慢(显然)
但我的问题是,有没有什么方法或想法可以加快查询结果或让它使用索引?
如果右侧有类似的内容,我不会看到同样的缓慢(例如 select * from table where fullpath like 'hi%'
编辑:Microsoft Sql server 2017 标准版
FWIW,我不认为之前提供的重复问题实际上是这个特定问题的重复,而是回答了一个更复杂的切向相关问题,即如何使用双通配符改进搜索(包含搜索类型)。有些答案可能也适用于这里,但对于这个更简单的问题来说过于复杂,因此我投票重新提出问题。我尝试使用更简单的解决方案找到合适的重复项,但找不到。
假设您确实严格意味着仅开始搜索类型(仅前导通配符)并且不包含搜索类型,那么有一些相当简单的解决方案。
一种解决方案涉及存储反转列的副本(计算列可以在此处提供帮助),然后在反转列上创建索引。然后,您可以反转通配符顺序,使其成为针对反转列的结尾搜索。这在逻辑上是等效的并且也是可控制的,因此允许以有效的方式使用索引。
示例代码:
请注意,您不应
SELECT *
在任何非临时代码中使用,尤其是当您担心性能时。仅列出您对该特定查询真正关心的列。它的性能更高,因为读取的数据少于必要的数据,并且通过选择索引和使用索引操作可能会产生更好的查询计划。如果您通常搜索文件名,请将它们单独存储而不是嵌入到
fullpath
.根据查询单独存储路径、文件名和扩展名可能会更好。
将使用比 的反向副本更少的空间
fullpath
。仅为文件名维护一个宽度较小的单独列。此外,如果您有多个文件扩展名类型,则可以在单独的列中维护tinyint 标志。
这只是插入/更新过程期间的一次任务。
这样你就可以
Like
完全避免操作符。SARGable
只是优化器使用索引的因素之一另一个主要因素是列宽。列宽越小,索引页的数量就会越少。因此优化器将不得不读取更少的页,因此使用索引的机会就更多。
优化器经常制定足够好的计划和成本有效的计划。在某些情况下,即使不使用索引,但计划仍然足够好。
不要在数据类型 varchar 的列上创建具有更大宽度的索引。如果表稍后包含数百万行,则该索引会被浪费,并且可能需要更长的时间来执行即使是返回较少行数的小查询