楼主: ligengocp

[精华] 一些sql语句的优化心得

[复制链接]
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
31#
发表于 2003-9-24 10:52 | 只看该作者
想请教一下exist和in的真正区别。
很多ORACLE的资料说一般来讲用EXIST方式效率比IN的方式效率要高。但是测试结果是绝大多数的情况下两者没有什么区别,执行计划也一样。

我觉得使用各种子查询需考虑的问题如下:对于一个关联子查询,子查询是每行外部查询的记录都要计算一次,然而对于一个非关联子查询,子查询只会执行一次,而且结果集被保存在内存中。因此,通常在外部查询返回相对较少的记录时,关联子查询比非关联子查询执行得更快;而子查询中只有少量的记录的时候,则非关联子查询将会比关联子查询执行得更快。

我不明白常说的exist比in效率高体现在什么地方?大家可以说说使用exist和in时,oracle底层的动作是如何的不一样呢?

使用道具 举报

回复
论坛徽章:
0
32#
发表于 2003-9-24 14:46 | 只看该作者
拜读!

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
33#
发表于 2003-9-24 14:53 | 只看该作者
最初由 colly_liu 发布
[B]我做了测试,这两种方法简直就是两个数量级的
16:20:03 SQL> select count(*) from mid_a_user_state_mon_gsm;

  COUNT(*)
----------
   1730920

Elapsed: 00:00:01.04
16:20:26 SQL> select count(*) from mid_b_svc_stat_mon_gsm;

  COUNT(*)
----------
   1996384

Elapsed: 00:00:17.06


select * from  mid_b_svc_stat_mon_gsm a                                                      
minus                                                                                         
select a.* from mid_b_svc_stat_mon_gsm a,mid_a_user_state_mon_gsm b where a.user_id=b.user_id
Elapsed: 00:36:03.04

select * from mid_b_svc_stat_mon_gsm a where not exists(select a.* from mid_b_svc_stat_mon_gsm
a,mid_a_user_state_mon_gsm b where a.user_id=b.user_id )
Elapsed: 00:00:00.05 [/B]



当然不一样了第二个可能数据在database buffer里

使用道具 举报

回复
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
34#
发表于 2003-9-26 15:34 | 只看该作者
好东西,又提高不少!

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
35#
发表于 2004-3-9 09:24 | 只看该作者

ok

count(*) 主要用于将数据量比较大的表的主要检索信息存储在db_block_buffer中。是优化数据库常见手段。

使用道具 举报

回复
论坛徽章:
4
授权会员
日期:2005-10-30 17:05:33ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
36#
发表于 2004-3-9 14:36 | 只看该作者
SQL> select a.jh from daa01 a
  2  minus
  3  select a.jh from daa01 a,daa01@dagang b where a.jh=b.jh
  4  /

JH
----------------
123
33-15
334
T11

SQL>
SQL> select jh from daa01 a where not exists(select a.jh from daa01
  2  a,daa01@dagang b where a.jh=b.jh)
  3  /

JH
----------------

这两条语句的查询结果居然不一样????????????
为什么?
为什么?
为什么?
为什么?
为什么?

使用道具 举报

回复
论坛徽章:
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
37#
发表于 2004-3-9 16:31 | 只看该作者
把你的语句改为: select jh from daa01 a where not exists(select 1 from daa01
2 a,daa01@dagang b where a.jh=b.jh)

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-12-12 10:53:09会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
38#
发表于 2004-3-10 10:35 | 只看该作者
现在感觉SQL优化的东西太多了,不知从何下手学了

使用道具 举报

回复
论坛徽章:
71
2015年新春福章
日期:2015-03-06 11:57:312013年新春福章
日期:2013-02-25 14:51:24双黄蛋
日期:2013-01-06 13:31:18蜘蛛蛋
日期:2013-01-06 10:26:08茶鸡蛋
日期:2012-11-21 19:35:23ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07版主2段
日期:2012-05-15 15:24:11铁扇公主
日期:2012-02-21 15:02:402012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
39#
发表于 2004-3-10 10:47 | 只看该作者
这个比较难 。 经验大于一切

使用道具 举报

回复
论坛徽章:
113
生肖徽章2007版:羊
日期:2011-10-11 10:20:29生肖徽章2007版:羊
日期:2011-10-11 10:20:29生肖徽章2007版:羊
日期:2011-10-11 10:20:29生肖徽章2007版:羊
日期:2011-10-11 10:20:29生肖徽章:猴
日期:2007-04-10 01:23:40生肖徽章:虎
日期:2011-10-11 10:20:29生肖徽章:羊
日期:2007-08-12 22:22:56生肖徽章:兔
日期:2007-08-15 17:25:14生肖徽章:虎
日期:2011-10-11 10:20:29生肖徽章:虎
日期:2007-09-24 07:24:16
40#
发表于 2004-9-28 09:54 | 只看该作者
收藏!

使用道具 举报

回复

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

本版积分规则 发表回复

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