如何优雅的使用 参数 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) 

 

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

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

 

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

declare @age int=666;

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

 

 

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

 

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐