我正在使用执行以下形式查询的 ORM:
SELECT Columns
FROM T
WHERE Col LIKE @p0 ESCAPE '~'
Col
被索引并且索引被覆盖。谓词是非常有选择性的。这些表有 500,000 行。
我总是在查询字符串前缀(例如'prefix%'
)。显然,这不是 SQL Server 静态已知的。但我知道 SQL Server 基本上能够根据LIKE
带有前缀的模式进行查找。
我希望 SQL Server 在执行时发现要扫描的索引的相关范围,并且只扫描该范围。不过,我得到的执行计划有一个索引扫描。
ORM 不支持OPTION (RECOMPILE)
,我不确定它是否是一个好的选择,因为查询在大约 20 毫秒内执行。(但是我希望这个查询运行得更快。通过搜索,它应该能够在 ~1ms 内运行)。
我能以某种方式让 SQL Server 在这里执行查找吗?
这正是我得到的计划。
有关此的更多信息,请参阅动态搜索和隐藏的隐式转换。
检查索引是否确实覆盖以及参数的数据类型对于列定义是否正确(即,如果列是
varchar
并且参数是nvarchar
这会导致扫描)。