SQLE中的索引使用情况:搜索与扫描

Tau*_*ris 2 sql-server indexing sql-server-2008-r2 database-performance

给定以下架构:

create table dbo.SomeTable 
(
    ID int primary key identity(1, 1),
    SomeColumn varchar(50)
);

create index IX_SomeColumn on dbo.SomeTable (SomeColumn);
Run Code Online (Sandbox Code Playgroud)

并用一些数据填充它:

declare @i int = 1000;

while @i > 0 begin
    set @i = @i - 1;

    insert dbo.SomeTable (SomeColumn) 
    values (convert(varchar, @i))
end
Run Code Online (Sandbox Code Playgroud)

此查询执行索引搜索:

select ID 
from dbo.SomeTable 
where SomeColumn = '431'
Run Code Online (Sandbox Code Playgroud)

此查询执行索引扫描时:

select ID 
from dbo.SomeTable 
where case when SomeColumn = '431' then 1 else 0 end = 1
Run Code Online (Sandbox Code Playgroud)

有没有办法让后者(或类似的东西)执行索引搜索?

我问,因为我希望能够将其case when放入视图的选择列表并在where子句中使用它,但如果我无法让SQL Server执行索引,它将永远不会像原始格式一样好寻求.

Mar*_*ith 6

您可以通过使case when SomeColumn = '431' then 1 else 0 end表达式成为计算列并索引计算列来获得搜索的唯一方法.

然后,您应该发现表达式与允许搜索的计算列匹配(以维持额外索引为代价).

(如果你遇到自动paremeterisation问题阻止匹配添加冗余1=1会阻止这种情况.SQL小提示计划显示寻求)