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执行索引,它将永远不会像原始格式一样好寻求.
您可以通过使case when SomeColumn = '431' then 1 else 0 end
表达式成为计算列并索引计算列来获得搜索的唯一方法.
然后,您应该发现表达式与允许搜索的计算列匹配(以维持额外索引为代价).
(如果你遇到自动paremeterisation问题阻止匹配添加冗余1=1
会阻止这种情况.SQL小提示计划显示寻求)