使用UNION代替OR并不能得到优化的原因

stevenjin 2018-12-16 10:13:47
使用UNION ALL语句替代OR后,执行时间反而更长了,而且多了许多数据:
SELECT * FROM A WHERE ORDERID='001' OR ORDERID='002' --执行了7秒
SELECT * FROM A WHERE ORDERID='001' UNION ALL SELECT * FROM A WHERE ORDERID='002'--执行了13秒

而用UNION后,执行时间并没有缩减,虽然数据条数是一样的。
...全文
650 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
大施兄Nicolas 2018-12-18
  • 打赏
  • 举报
回复
sql 优化 要有一个过程 慢慢来
吉普赛的歌 2018-12-17
  • 打赏
  • 举报
回复
SELECT 
COUNT(1) AS total
,COUNT(DISTINCT orderId) AS orderIdCnt
,(COUNT(DISTINCT orderId)*1.0)/COUNT(1) AS selectRate
FROM A WITH(NOLOCK)
这个的结果贴出来看下。
二月十六 2018-12-17
  • 打赏
  • 举报
回复
引用 6 楼 stevenjin 的回复:
哦,没有做索引

给ORDERID加上索引再试试
吉普赛的歌 2018-12-17
  • 打赏
  • 举报
回复
https://www.cnblogs.com/snake-hand/archive/2008/04/22/2452384.html 越接近1越好, 但最低什么情况有效, 这个不好下定论。 但只有几个值的列, 基本用不到索引, 即使能用上效果也不好。
stevenjin 2018-12-17
  • 打赏
  • 举报
回复
哦,没有做索引
吉普赛的歌 2018-12-17
  • 打赏
  • 举报
回复
sql 优化不是一个简单的事, 要根据实际的情况来。 不是看到网上哪个博客说了可以怎么优化, 那么按这个原则就一定有效果。 因为每个场景都是千差万别的, 哪里能不变应万变? 具体到你这个案例, 要先保证几件事情, 才可能有效果: 1. ORDERID 字段上建立了索引; 2. ORDERID 本身的选择性很高, 也就是说给一个值, 查出来的记录占数据量的百分比越低越好。 如果给一个值出来 20% 以上的数据, 基本上没什么作用。
卖水果的net 2018-12-17
  • 打赏
  • 举报
回复
如果表 A上不存在任何索引,则第一个查询,全表扫描一次,第二个查询,全表扫描两次。 所用的时间(包含 CPU的消耗)都是两倍。
二月十六 2018-12-17
  • 打赏
  • 举报
回复
楼主表字段的索引情况以及执行计划贴一下
Dear SQL(燊) 2018-12-17
  • 打赏
  • 举报
回复
这个要看具体情况分析,不一定说UNION ALL 一定比OR快,把你的执行计划贴出来

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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