【发布时间】:2015-10-20 19:51:50
【问题描述】:
给定以下架构:
create table dbo.SomeTable
(
ID int primary key identity(1, 1),
SomeColumn varchar(50)
);
create index IX_SomeColumn on dbo.SomeTable (SomeColumn);
并用一些数据填充它:
declare @i int = 1000;
while @i > 0 begin
set @i = @i - 1;
insert dbo.SomeTable (SomeColumn)
values (convert(varchar, @i))
end
此查询执行索引查找:
select ID
from dbo.SomeTable
where SomeColumn = '431'
当此查询执行索引扫描时:
select ID
from dbo.SomeTable
where case when SomeColumn = '431' then 1 else 0 end = 1
有没有办法让后者(或等效的东西)改为执行索引查找?
我问是因为我希望能够将case when 放入视图的选择列表中并在where 子句中使用它,但如果可以的话,它的性能永远不会像原始表单那样好'不让 SQL Server 进行索引搜索。
【问题讨论】:
-
您的第二个查询不是 SARGEBLE。在将
CASE语句应用于表中的每一行之前,它无法知道它的值。这就是你得到扫描的原因。当然很明显CASE语句只会在SomeColumn = '431'时返回1,但是SQL Server看起来不够深入,无法弄清楚。
标签: sql-server indexing sql-server-2008-r2 database-performance