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 在这里执行搜索吗?
我希望 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
这会导致扫描)。
归档时间: |
|
查看次数: |
108 次 |
最近记录: |