当模式为“prefix%”形式时,如何获得 (LIKE @p) 的良好执行计划

boo*_*ife 4 sql-server sql-server-2014

我正在使用一个执行表单查询的 ORM:

SELECT Columns
FROM T
WHERE Col LIKE @p0 ESCAPE '~'
Run Code Online (Sandbox Code Playgroud)

Col已编入索引且索引正在覆盖。谓词非常有选择性。这些表有 500,000 行。

我总是在查询字符串前缀(例如'prefix%')。显然,这里的 SQL Server 不是静态知道的。但我知道 SQL Server 基本上能够根据LIKE带有前缀的模式进行查找。

我希望 SQL Server 在执行时发现要扫描的索引的相关范围,并且只扫描该范围。不过,我得到的执行计划有一个索引扫描。

ORM 不支持OPTION (RECOMPILE),我不确定它是否是一个不错的选择,因为查询在大约 20 毫秒内执行。(但是我希望这个查询更快。通过搜索,这应该能够在 ~1ms 内运行)。

我可以以某种方式让 SQL Server 在这里执行搜索吗?

Mar*_*ith 5

我希望 SQL Server 在执行时发现要扫描的索引的相关范围,并且只扫描该范围。

这正是我得到的计划。

CREATE TABLE T(Columns VARCHAR(50), 
               Col VARCHAR(50), 
               INDEX IX(Col, Columns));

DECLARE @p0 VARCHAR(50) = 'foobar%'

SELECT Columns
FROM T
WHERE Col LIKE @p0 ESCAPE '~'
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

有关这方面的更多信息,请参阅动态搜索和隐藏的隐式转换

检查索引是否确实覆盖以及参数的数据类型对于列定义是否正确(即,如果列是varchar并且参数是,nvarchar这会导致扫描)。