我对一个看起来像这样的大表有一个查询:
declare @myIdParam int = 1
select *
from myTable
where (@myIdParam is null or myTable.Id = @myIdParam)
Run Code Online (Sandbox Code Playgroud)
where子句中有几个类似这样的条件,也有很多连接,但这是一个总结。
实际上,如果@myIdParam 为空,我们不希望使用此参数限制结果。
我不是数据库专家,但从我的测试来看,似乎对每条记录都进行了 NULL 检查,并且没有以任何方式优化。
如果我删除空检查并假设参数不为空,则查询会立即返回。否则,最多需要十秒钟。
有没有办法优化它,以便在运行时只进行一次检查?
一种方法是使用动态 SQL,使用空检查来可选地添加 where 子句的那部分。
declare @myIdParam int = 1
declare @vc_dynamicsql varchar(max)
set @vc_dynamicsql = 'select * from myTable where 1=1'
if @myIdParam is not null
set @vc_dynamicsql = @vc_dynamicsql + ' and myTable.Id = @myIdParam'
EXECUTE sp_executesql @vc_dynamicsql
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11412 次 |
最近记录: |