查看: 20007|回复: 23

[PL/SQL] 请教minus/not in/not exists的原理和效率

[复制链接]
论坛徽章:
1
优秀写手
日期:2014-06-21 06:00:12
跳转到指定楼层
1#
发表于 2008-5-8 14:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有两张表:

gal_voucher_item:1066行数据
gal_voucher_item_detail:423705行数据

现在想取出第一个表里item_iid不在第二个表的item_iid里的数据,

分别用minus/not in/not exists,sql和所需时间如下(呵呵,没写错吧):

minus:
  1. Select *
  2. From gal_voucher_item item
  3. Where item_iid In (Select item_iid
  4.                                                                          From gal_voucher_item
  5.                                                                          Minus
  6.                                                                          Select item_iid From gal_voucher_item_detail);
复制代码
时间:4.438/4.39 s

not in:

  1. Select * From gal_voucher_item Where item_iid Not In (Select item_iid From gal_voucher_item_detail);
复制代码

时间:没跑出来

not exists:

  1. Select *
  2. From gal_voucher_item item
  3. Where Not Exists (Select 1 From gal_voucher_item_detail detail Where item.item_iid = detail.item_iid);
复制代码

时间:没跑出来


总结:minus很快就出来了,而not in和not exists却跑都跑不出来,这是什么原因呢,谁能解释一下里面的原理,谢谢!
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
2#
发表于 2008-5-8 14:58 | 只看该作者
试试如下的速度如何?

Select a.*
  From gal_voucher_item a, gal_voucher_item_detail b
  where a.item_iid = b.item_iid(+)
    and b.item_iid is null;

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-06-21 06:00:12
3#
 楼主| 发表于 2008-5-8 15:01 | 只看该作者

回复 #2 bell6248 的帖子

你的sql很有创意哦,刚试过了,时间是8.125/8.703/8.240 s

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-06-21 06:00:12
4#
 楼主| 发表于 2008-5-8 15:03 | 只看该作者
谢谢bell,刚知道原来sql可以这样写,不过速度还是minus快,能分析一下这几个sql的原理和效率吗?

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
5#
发表于 2008-5-8 15:03 | 只看该作者
估计是没有建索引!

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-06-21 06:00:12
6#
 楼主| 发表于 2008-5-8 15:04 | 只看该作者

回复 #5 bell6248 的帖子

不会啊,这个item_iid是主键,oracle不是默认建索引了吗

使用道具 举报

回复
论坛徽章:
4
数据库板块每日发贴之星
日期:2008-05-14 01:01:572010新春纪念徽章
日期:2010-03-01 11:19:50ITPUB 11周年纪念徽章
日期:2012-10-10 13:11:142013年新春福章
日期:2013-02-25 14:51:24
7#
发表于 2008-5-8 16:03 | 只看该作者

回复 #4 longrm 的帖子

分析一下sql的执行计划。

使用道具 举报

回复
论坛徽章:
9
会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:鸡
日期:2008-01-02 17:35:53奥运会纪念徽章:花样游泳
日期:2008-05-27 23:33:24奥运会纪念徽章:垒球
日期:2008-06-17 15:23:21奥运会纪念徽章:足球
日期:2008-07-14 17:22:53奥运会纪念徽章:跳水
日期:2008-08-06 16:18:33奥运会纪念徽章:曲棍球
日期:2008-09-11 10:05:202011新春纪念徽章
日期:2011-02-18 11:43:35
8#
发表于 2008-5-8 16:58 | 只看该作者
我分析执行最合理是.
gal_voucher_item 做hash表跟 gal_voucher_item_detail hash 连接.item_iid
建立索引.gal_voucher_item用full table scan  .gal_voucher_item_detail  采用idx full scan



这是我设想的执行计划.不知道实质是怎么样2.

使用道具 举报

回复
论坛徽章:
138
19周年集字徽章-19
日期:2020-06-08 08:30:56马上加薪
日期: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马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02路虎
日期:2013-11-22 12:26:18问答徽章
日期:2014-05-08 12:15:31
9#
发表于 2008-5-8 23:28 | 只看该作者
Select *
From gal_voucher_item  item
Where Not Exists (Select /*+ hash_aj */ 1 From gal_voucher_item_detail detail Where item.item_iid = detail.item_iid);

试试这个

还有给出2个表的索引信息,帖出执行计划

[ 本帖最后由 棉花糖ONE 于 2008-5-8 23:51 编辑 ]

使用道具 举报

回复
论坛徽章:
22
奥运会纪念徽章:网球
日期:2008-04-20 06:41:56奥运会纪念徽章:曲棍球
日期:2008-06-09 11:33:15生肖徽章2007版:蛇
日期:2008-05-27 15:41:54生肖徽章2007版:羊
日期:2008-05-27 15:39:39授权会员
日期:2008-05-11 12:23:06奥运会纪念徽章:棒球
日期:2008-05-06 16:56:10生肖徽章2007版:马
日期:2008-05-06 11:22:16奥运会纪念徽章:拳击
日期:2008-05-03 13:23:55奥运会纪念徽章:赛艇
日期:2008-05-01 16:12:00奥运会纪念徽章:蹦床
日期:2008-05-01 10:56:32
10#
发表于 2008-5-9 07:13 | 只看该作者
原帖由 棉花糖ONE 于 2008-5-8 23:28 发表
Select *
From gal_voucher_item  item
Where Not Exists (Select /*+ hash_aj */ 1 From gal_voucher_item_detail detail Where item.item_iid = detail.item_iid);

试试这个

还有给出2个表的索引信息,帖出执行计划

使用道具 举报

回复

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

本版积分规则 发表回复

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