sql-server - CASE WHEN 在 SQL Server : seek vs scan 中使用索引

标签 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);

并用一些数据填充它:

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 放入 View 的选择列表中并在 where 子句中使用它,但它会如果我无法让 SQL Server 执行索引查找,则永远不会像原始表单那样执行。

最佳答案

您可以在那里进行查找的唯一方法是使 case when SomeColumn = '431' then 1 else 0 end 表达式成为计算列并索引计算列。

然后您应该会发现该表达式与允许查找的计算列匹配(以维护额外索引为代价)。

(如果您遇到自动参数化阻止匹配的问题,添加冗余 1=1 将阻止这种情况。SQL Fiddle with plan showing a seek)

关于sql-server - CASE WHEN 在 SQL Server : seek vs scan 中使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33245628/

相关文章:

sql-server - 表 '...' 中的计算列 '...' 无法持久化,因为该列是不确定的?

database - 聚集索引与索引查找

.net - 从 .NET sqlcommand 传递给 SQL 的值不正确

sql-server-2008-r2 - 如何将SQL Server 2008 R2数据库转换为SQL Server 2012?

sql - 计算 "complex"t-SQL 语句中更新的记录数

sql-server - 编写 SQL 查询时这些子句的正确顺序是什么?

database - 如何在 Grails 中使用 Hibernate 索引?

sql - 如何创建生产 SQL 数据库的副本?

sql-server - SQL Server 2008 R2 中的空间会降低性能

search - 当数据增长时,如何在不增加分片大小的情况下处理负载?