欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何优雅的使用 参数 is null而不导致全表扫描(破坏索引)

程序员文章站 2022-09-07 13:36:18
相信大家在很多实际业务中(特别是后台系统)会使用到各种筛选条件来筛选结果集 首先添加测试数据 1.有使用EXEC来避免全表扫描 或者条件少的情况下 2.使用IS NULL来实现 第一种方案,不会破坏索引,但冗余的代码看起来让人难受 第二种方案,会导致全表扫描(破坏索引) 以上是网上查阅的资料,方案二 ......

 

相信大家在很多实际业务中(特别是后台系统)会使用到各种筛选条件来筛选结果集

首先添加测试数据

create table templist(id int identity,name varchar(12),  age int)
go
create index idx_age on templist (age)
go


declare @i int;
set @i=0;
while @i<10000
begin
  insert into templist (name, age)values(cast(@i as varchar),@i)
  set @i=@i+1;
end
go

 

 

1.有使用exec来避免全表扫描

declare @age int=666;

declare @sql nvarchar(max)
set @sql = 'select * from templist'

if @age is not null
    set @sql = @sql + ' where age = @age'
    
exec sp_executesql @sql, n'@age int', @age

或者条件少的情况下

declare @age int=666;

if @age is not null
    select * from templist where age = @age
else 
    select * from templist

2.使用is null来实现

declare @age int=666;

select * from templist where (@age is null or age = @age)

select * from templist where (age = @age or @age is null)

select * from templist where age=isnull(@age, age) 

 

第一种方案,不会破坏索引,但冗余的代码看起来让人难受

如何优雅的使用 参数 is null而不导致全表扫描(破坏索引)

如何优雅的使用 参数 is null而不导致全表扫描(破坏索引)

第二种方案,会导致全表扫描(破坏索引)

如何优雅的使用 参数 is null而不导致全表扫描(破坏索引)

如何优雅的使用 参数 is null而不导致全表扫描(破坏索引)

 

以上是网上查阅的资料,方案二不符合sarg,问题在or,如果我不使用or,用and呢

declare @age int=666;

select * from templist where @age is not null and age = @age

如何优雅的使用 参数 is null而不导致全表扫描(破坏索引)

如何优雅的使用 参数 is null而不导致全表扫描(破坏索引)

 

 

版权声明:本文原创发表于 博客园,作者为  本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。