楼主: rollingpig

[精华] 一次SQL Tuning引出来的not in , not exists 语句的N种写法

[复制链接]
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期: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:142013年新春福章
日期:2013-02-25 14:51:24
21#
 楼主| 发表于 2005-8-11 08:26 | 只看该作者
最初由 susan_j 发布
[B]想请问rollingpig, 被删除的数据量是多少? [/B]

3000左右

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
17
会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442010新春纪念徽章
日期:2010-03-01 11:20:05
22#
发表于 2005-8-11 09:04 | 只看该作者
最初由 rollingpig 发布
[B]在 9i 里面,in 和 exists已经基本一样,Oracle会在内部自动作转换

倒是 我提到的其中几个转换值的深究

1。in / exists ==> join

2。Add distinct in IN Clause or subquery

3. Add condition where rownum < 2 in  exists clause (这个忘了演示了)

4, not exists / not in  ==> outer join + is null condition
(更正一下,是outer join + is null condition 不是 not null condition ) [/B]


4, not exists / not in ==> outer join + is null condition
这个想法不错,测试一下。

使用道具 举报

回复
论坛徽章:
7
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:342008新春纪念徽章
日期:2008-02-13 12:43:03奥运会纪念徽章:羽毛球
日期:2008-05-28 20:12:222009新春纪念徽章
日期:2009-01-04 14:52:282010新春纪念徽章
日期:2010-03-01 11:06:12
23#
发表于 2005-8-11 10:15 | 只看该作者
以前我碰到楼主一样的问题,数据量不大,可用not EXIST  和NOT IN 都很慢。
我最后也是用outer join + is null condition解决的。

使用道具 举报

回复
论坛徽章:
7
ITPUB元老
日期:2005-04-22 09:33:06授权会员
日期:2005-10-30 17:05:33铁扇公主
日期:2006-04-13 11:04:44紫蜘蛛
日期:2006-04-13 11:05:58会员2006贡献徽章
日期:2006-04-17 13:46:34BLOG每日发帖之星
日期:2009-05-24 01:01:022010新春纪念徽章
日期:2010-03-01 11:08:29
24#
发表于 2005-8-11 10:34 | 只看该作者

使用道具 举报

回复
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期: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:142013年新春福章
日期:2013-02-25 14:51:24
25#
 楼主| 发表于 2005-8-11 11:17 | 只看该作者
赫赫,不小心发现了Oracle 写的not exists 和 not in 了。
就在 大名鼎鼎 的statspack里面,?/rdbms/admin/sppurge.sql

这下估计很多人都有一个很好的实例了

[php]
普通的
delete from stats$statspack_parameter sp
where instance_number = :inst_num
   and dbid            = :dbid
   and not exists (select 1
                     from stats$snapshot s
                    where s.dbid            = sp.dbid
                      and s.instance_number = sp.instance_number);


经过tuning的

alter session set hash_area_size=1048576;
delete --+ index_ffs(st)
  from stats$sqltext st
where (hash_value, text_subset) not in
       (select --+ hash_aj full(ss) no_expand
               hash_value, text_subset
          from stats$sql_summary ss
         where (   (   snap_id     < :lo_snap
                    or snap_id     > :hi_snap
                   )
                   and dbid            = :dbid
                   and instance_number = :inst_num
               )
            or (   dbid            != :dbid
                or instance_number != :inst_num)
        );


...
[/php]

大家有空可以测试一下效率,对比一下我提到的各种转换形式

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
38
ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14现任管理团队成员
日期:2012-10-18 17:11:21版主4段
日期:2012-05-15 15:24:112012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23
26#
发表于 2005-8-11 12:00 | 只看该作者
最初由 rollingpig 发布
[B]在 9i 里面,in 和 exists已经基本一样,Oracle会在内部自动作转换[/B]


我认为还是不一样的,不过我们的环境是10g,in还是经常会导致巨大的逻辑I/O,改成exists就立刻少了非常多逻辑I/O,尽管有的时候在sqlplus里看起来执行计划是一样的。

使用道具 举报

回复
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期: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:142013年新春福章
日期:2013-02-25 14:51:24
27#
 楼主| 发表于 2005-8-11 12:54 | 只看该作者

可能在有一些情况下会一致
有些情况则会不一致

To all,
实际上,不能够说是那种变换比其他好,或者是说,跟实际数据的情况有很大联系,比如表的大小,Not IN 部分的大小,COLUMN的聚合度,都会对最后的执行效率产生影响。


我所举的例子只是提供大家一种思路(N种思路)  ,在某些情况下,如果你的一些带有(not) in / exists(甚至是JOIN)的语句的执行效率不好了,不妨尝试一下不同的变换形式,有时候会起到意想不到的效果。

使用道具 举报

回复
论坛徽章:
63
19周年集字徽章-19
日期:2020-09-23 02:43:002012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:42:472011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
28#
发表于 2005-8-11 13:39 | 只看该作者
对.通常执行计划的一些比较.

有时候in和exists是完全一样的.

具体应该是与数据大小等有关系的.

使用道具 举报

回复
论坛徽章:
6
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-11-04 13:13:52会员2006贡献徽章
日期:2006-04-17 13:46:34在线时间
日期:2006-12-24 04:01:01会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
29#
发表于 2005-8-11 17:05 | 只看该作者
感觉就是所有的武器都试一遍,比较一下,选最好的

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
30#
发表于 2005-8-11 17:32 | 只看该作者
最初由 flyerchen2000 发布
[B]感觉就是所有的武器都试一遍,比较一下,选最好的 [/B]


同感,既然不能下定论,只能在实际情况中都试一下。收藏这个帖子。

使用道具 举报

回复

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

本版积分规则 发表回复

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