查看: 6062|回复: 15

[讨论] 精通sql优化的进,怎么把这条语句从in变成exist.

[复制链接]
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2011-9-6 11:27 | 显示全部楼层 |阅读模式
执行计划就不写了,索引该建的都建了,我的问题主要是如果把这个In语句改成exist,这个有点复杂,不会。
先谢谢各位高手了。

SELECT up.userid, up.realname, up.mobilephone, up.homephone
  from user_profile as up
where up.userid in (select user_id
                       from ecs_order_info
                      where pay_status = 2
                        and shipping_status > 0
                        and extension_id = 0
                     union
                     select user_id
                       from ecs_order_info_history
                      where pay_status = 2
                        and shipping_status > 0
                        and extension_id = 0
                      GROUP BY user_id)

[ 本帖最后由 wushi8 于 2011-9-6 11:30 编辑 ]
认证徽章
论坛徽章:
9
ITPUB9周年纪念徽章
日期:2010-10-08 09:32:27ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15蜘蛛蛋
日期:2012-02-29 15:56:41雪佛兰
日期:2013-09-18 11:35:10ITPUB社区12周年站庆徽章
日期:2013-10-08 14:53:15ITPUB社区12周年站庆徽章
日期:2013-10-08 14:57:28ITPUB社区12周年站庆徽章
日期:2013-10-08 14:59:19问答徽章
日期:2014-02-25 16:50:06优秀写手
日期:2014-03-22 06:00:12
发表于 2011-9-6 11:41 | 显示全部楼层
SELECT   UP.userid,
         UP.realname,
         UP.mobilephone,
         UP.homephone
  FROM   user_profile UP
WHERE   EXISTS
            (SELECT   'x'
               FROM   (SELECT   user_id
                         FROM   ecs_order_info
                        WHERE       pay_status = 2
                                AND shipping_status > 0
                                AND extension_id = 0
                       UNION
                         SELECT   user_id
                           FROM   ecs_order_info_history
                          WHERE       pay_status = 2
                                  AND shipping_status > 0
                                  AND extension_id = 0
                       GROUP BY   user_id) t1
              WHERE   UP.userid = t1.userid);

使用道具 举报

回复
论坛徽章:
136
ITPUB年度最佳技术回答奖
日期:2010-06-12 13:17:14现代
日期:2013-10-02 14:53:59路虎
日期:2013-11-22 12:26:182014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
发表于 2011-9-6 12:12 | 显示全部楼层
你这地方的group by没有意义

使用道具 举报

回复
论坛徽章:
5
生肖徽章2007版:鼠
日期:2008-01-02 17:35:53生肖徽章2007版:猴
日期:2009-04-07 11:17:10ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04宝马
日期:2014-02-10 11:54:34
发表于 2011-9-6 12:16 | 显示全部楼层
这和精不精通sql优化貌似没关系

使用道具 举报

回复
论坛徽章:
8
数据库板块每日发贴之星
日期:2009-06-12 01:01:02数据库板块每日发贴之星
日期:2009-06-21 01:01:01ITPUB9周年纪念徽章
日期:2010-10-08 09:32:272010广州亚运会纪念徽章:游泳
日期:2010-11-12 16:42:092011新春纪念徽章
日期:2011-02-18 11:42:502010广州亚运会纪念徽章:三项全能
日期:2011-02-26 13:07:50咸鸭蛋
日期:2011-08-30 15:51:05ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22
发表于 2011-9-7 10:58 | 显示全部楼层
非要转换成exsits么。

使用道具 举报

回复
认证徽章
论坛徽章:
2
2011新春纪念徽章
日期:2011-02-18 11:43:34ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22
发表于 2011-9-7 11:04 | 显示全部楼层
确实 group by 没必要,为啥ecs_order_info不用group by呢。

要么来个distinct试试

exsits还是有必要的,这样速度会快一些。

使用道具 举报

回复
论坛徽章:
5
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51数据库板块每日发贴之星
日期:2011-07-22 01:01:02蜘蛛蛋
日期:2011-08-24 14:10:13ITPUB十周年纪念徽章
日期:2011-11-01 16:24:042012新春纪念徽章
日期:2012-01-04 11:54:26
发表于 2011-9-7 12:47 | 显示全部楼层
又看到 很多人 说 exists 快些。。。 讨论这个一定要 说明 oracle版本 限制条件 还有具体SQL 否则没意义

使用道具 举报

回复
论坛徽章:
7
授权会员
日期:2010-12-06 19:50:26数据库板块每日发贴之星
日期:2011-09-03 01:01:01迷宫蛋
日期:2011-09-08 16:30:08ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04玉石琵琶
日期:2012-02-21 15:04:38最佳人气徽章
日期:2012-03-13 17:39:18
发表于 2011-9-7 13:06 | 显示全部楼层
10g开始,exist和in 已经差别不大了。

使用道具 举报

回复
论坛徽章:
5
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51数据库板块每日发贴之星
日期:2011-07-22 01:01:02蜘蛛蛋
日期:2011-08-24 14:10:13ITPUB十周年纪念徽章
日期:2011-11-01 16:24:042012新春纪念徽章
日期:2012-01-04 11:54:26
发表于 2011-9-7 14:06 | 显示全部楼层

回复 #8 我上面有人 的帖子

如果SQL很简单 的确是没有区别,如果SQL复杂了 一样有区别 做OBIEE 优化的时候遇到多起 这样的案例

使用道具 举报

回复
论坛徽章:
16
授权会员
日期:2005-11-01 10:49:02ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472011新春纪念徽章
日期:2011-02-18 11:43:322010年世界杯参赛球队:南非
日期:2010-05-12 11:08:572010新春纪念徽章
日期:2010-03-01 11:04:542009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:狗
日期:2008-10-31 12:50:13生肖徽章2007版:狗
日期:2008-10-24 18:01:04奥运会纪念徽章:排球
日期:2008-10-24 13:30:01生肖徽章2007版:狗
日期:2008-10-20 14:41:16
发表于 2011-9-8 11:41 | 显示全部楼层
把 union 放在外层才是优化的重点吧

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表