or 写法问题

jldzy 2015-01-29 09:02:30
现在存储过程里面参数比较多,一般都是用
select
from a join b on ....
where (@i_a is null or a.x=@i_a)
and (@i_b is null or a.x=@i_b)
...

这样的写法在性能上有什么问题不?
...全文
282 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jldzy 2015-01-30
  • 打赏
  • 举报
回复
现在已经知道他的问题,性能低,就是因为OR 条件, 要不改成 动态SQL
hepe00 2015-01-29
  • 打赏
  • 举报
回复
where a.x=(case when @i_a is null then a.x else @i_a end)
	and a.x=(case when @i_b is null then a.x else @i_b end)
可使用动态SQL,实现条件的筛选,优点:可重用执行计划,利用索引。
Tiger_Zhao 2015-01-29
  • 打赏
  • 举报
回复
可以随意加条件的功能和执行性能是对立的,没有完美的方案。
这是需求分析阶段就要进行取舍的。
江南小鱼 2015-01-29
  • 打赏
  • 举报
回复
引用 3 楼 jldzy 的回复:
@lovelj2012, 你们一般这样的SQL 是怎么写的?
不会 只是针对你的太多or,提出的一种替代写法 我建议你先不要抠字眼关注性能、效率,效率、性能如何不是讨论出来的,测试环境去用! 有性能问题,再考虑替代方案。
jldzy 2015-01-29
  • 打赏
  • 举报
回复
在用 PROFILE ON 的时候 发现 (@i_a is null or a.x=@i_a) 发现 EstimateRows 和 直接赋值(select * from xx where xx=@id) 差别比较大,
卖水果的net 版主 2015-01-29
  • 打赏
  • 举报
回复
性能没有问题,只是多了几个标量的计算。
jldzy 2015-01-29
  • 打赏
  • 举报
回复
@lovelj2012, 你们一般这样的SQL 是怎么写的?
江南小鱼 2015-01-29
  • 打赏
  • 举报
回复
你的sql等价于
select
 from a  join b on ....
 where a.x=isnull(@i_a,a.x)  and  a.x= isnull(@i_b,a.x)
效率有木有问题,这个要看数据量、索引等等
xiaoxiangqing 2015-01-29
  • 打赏
  • 举报
回复
太多的话,可能会用不了索引
江南小鱼 2015-01-29
  • 打赏
  • 举报
回复
引用 10 楼 jldzy 的回复:
[quote=引用 6 楼 lovelj2012 的回复:] [quote=引用 3 楼 jldzy 的回复:] @lovelj2012, 你们一般这样的SQL 是怎么写的?
不会 只是针对你的太多or,提出的一种替代写法 我建议你先不要抠字眼关注性能、效率,效率、性能如何不是讨论出来的,测试环境去用! 有性能问题,再考虑替代方案。[/quote] 能分享下你的 替代写法 ?[/quote] 你没明白我表达的意思
jldzy 2015-01-29
  • 打赏
  • 举报
回复
引用 6 楼 lovelj2012 的回复:
[quote=引用 3 楼 jldzy 的回复:] @lovelj2012, 你们一般这样的SQL 是怎么写的?
不会 只是针对你的太多or,提出的一种替代写法 我建议你先不要抠字眼关注性能、效率,效率、性能如何不是讨论出来的,测试环境去用! 有性能问题,再考虑替代方案。[/quote] 能分享下你的 替代写法 ?
jldzy 2015-01-29
  • 打赏
  • 举报
回复
看执行计划,这种写法是导致cluster index scan DECLARE @id varchar(10) SET @id='OOOO' SELECT * FROM xxx where Id=@id

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧