楼主: paulyibinyi

请教in和exists的区别

[复制链接]
招聘 : Java研发
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
41#
发表于 2008-4-14 15:03 | 只看该作者
原帖由 microsoft_fly 于 2008-4-14 14:42 发表
我觉得很正常,如果一样,就没必要同时有in和exists,更何况,语句一样执行计划都会不一样,关键上如何调优最重要!我倒觉得你这里即使用in为什么consistent gets还有点大!

应该是subquery本身的consistent gets就大,楼主可以试试

使用道具 举报

回复
论坛徽章:
5
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53奥运会纪念徽章:羽毛球
日期:2008-06-23 12:00:05奥运会纪念徽章:柔道
日期:2008-07-04 09:42:36奥运会纪念徽章:皮划艇激流回旋
日期:2008-08-12 14:50:402010新春纪念徽章
日期:2010-03-01 11:19:07
42#
发表于 2008-4-14 15:08 | 只看该作者
楼主看看这两个语句的逻辑读.
select /*+full(a)*/
        count(*)
from tb_user a
/

Select ID
From tb_role f
where e.role_id = f.id
Connect By Prior Id = parent_id
Start With Id = 1
/

[ 本帖最后由 mihawk 于 2008-4-14 15:10 编辑 ]

使用道具 举报

回复
论坛徽章:
76
双子座
日期:2015-07-28 14:26:072012新春纪念徽章
日期:2012-02-13 15:09:52ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15鲜花蛋
日期:2011-08-26 02:02:24管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:皮划艇
日期:2011-04-18 11:24:412011新春纪念徽章
日期:2011-02-18 11:43:342011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
43#
 楼主| 发表于 2008-4-14 15:10 | 只看该作者
原帖由 anlinew 于 2008-4-14 15:03 发表

应该是subquery本身的consistent gets就大,楼主可以试试

谢谢确实是

SQL> Select ID
  2                        From tb_role f
  3                      Connect By Prior Id = parent_id
  4                      Start With Id = 1;

8974 rows selected.


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=18 Bytes=162)
   1    0   CONNECT BY (WITH FILTERING)
   2    1     NESTED LOOPS
   3    2       INDEX (UNIQUE SCAN) OF 'PK_TB_ROLE' (UNIQUE) (Co
          st=1 Card=1 Bytes=5)

   4    2       TABLE ACCESS (BY USER ROWID) OF 'TB_ROLE'
   5    1     NESTED LOOPS
   6    5       BUFFER (SORT)
   7    6         CONNECT BY PUMP
   8    5       TABLE ACCESS (BY INDEX ROWID) OF 'TB_ROLE' (Cost
          =3 Card=18 Bytes=162)

   9    8         INDEX (RANGE SCAN) OF 'INX_TB_ADMIN_ROLE_PARENT_ID'
          (NON-UNIQUE) (Cost=1 Card=18)





Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      10066  consistent gets
          0  physical reads
          0  redo size
      97091  bytes sent via SQL*Net to client
       7004  bytes received via SQL*Net from client
        600  SQL*Net roundtrips to/from client
         17  sorts (memory)
          0  sorts (disk)
       8974  rows processed
那应该没有再优化的余地了吧

使用道具 举报

回复
论坛徽章:
76
双子座
日期:2015-07-28 14:26:072012新春纪念徽章
日期:2012-02-13 15:09:52ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15鲜花蛋
日期:2011-08-26 02:02:24管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:皮划艇
日期:2011-04-18 11:24:412011新春纪念徽章
日期:2011-02-18 11:43:342011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
44#
 楼主| 发表于 2008-4-14 15:15 | 只看该作者
原帖由 mihawk 于 2008-4-14 15:08 发表
楼主看看这两个语句的逻辑读.
select /*+full(a)*/
        count(*)
from tb_user a
/

Select ID
From tb_role f
where e.role_id = f.id
Connect By Prior Id = parent_id
Start With Id = 1
/



Select ID
From tb_role f
where e.role_id = f.id
Connect By Prior Id = parent_id
Start With Id = 1
/  
这个sql有问题
或者你想要的是
select id, role_id, login
                          from tb_user e
                         where Exists (Select ID
                                  From tb_role f
                                 where e.role_id = f.id
                                Connect By Prior Id = parent_id
                                 Start With Id = 1)的
的逻辑读

使用道具 举报

回复
论坛徽章:
76
双子座
日期:2015-07-28 14:26:072012新春纪念徽章
日期:2012-02-13 15:09:52ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15鲜花蛋
日期:2011-08-26 02:02:24管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:皮划艇
日期:2011-04-18 11:24:412011新春纪念徽章
日期:2011-02-18 11:43:342011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
45#
 楼主| 发表于 2008-4-14 15:18 | 只看该作者
SQL> select /*+full(a)*/
  2             count(*)
  3     from tb_user a
  4     ;

  COUNT(*)
----------
      8556


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=8 Card=1)
   1    0   SORT (AGGREGATE)
   2    1     TABLE ACCESS (FULL) OF 'tb_user' (Cost=8 Card=8556)




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        184  consistent gets
          0  physical reads
          0  redo size
        308  bytes sent via SQL*Net to client
        426  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
46#
发表于 2008-4-14 15:23 | 只看该作者
原帖由 paulyibinyi 于 2008-4-14 15:10 发表

谢谢确实是

SQL> Select ID
  2                        From tb_role f
  3                      Connect By Prior Id = parent_id
  4                      Start With Id = 1;

8974 rows selected.


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=18 Bytes=162)
   1    0   CONNECT BY (WITH FILTERING)
   2    1     NESTED LOOPS
   3    2       INDEX (UNIQUE SCAN) OF 'PK_TB_ROLE' (UNIQUE) (Co
          st=1 Card=1 Bytes=5)

   4    2       TABLE ACCESS (BY USER ROWID) OF 'TB_ROLE'
   5    1     NESTED LOOPS
   6    5       BUFFER (SORT)
   7    6         CONNECT BY PUMP
   8    5       TABLE ACCESS (BY INDEX ROWID) OF 'TB_ROLE' (Cost
          =3 Card=18 Bytes=162)

   9    8         INDEX (RANGE SCAN) OF 'INX_TB_ADMIN_ROLE_PARENT_ID'
          (NON-UNIQUE) (Cost=1 Card=18)





Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      10066  consistent gets
          0  physical reads
          0  redo size
      97091  bytes sent via SQL*Net to client
       7004  bytes received via SQL*Net from client
        600  SQL*Net roundtrips to/from client
         17  sorts (memory)
          0  sorts (disk)
       8974  rows processed
那应该没有再优化的余地了吧

那就要看业务逻辑了

[ 本帖最后由 anlinew 于 2008-4-14 15:26 编辑 ]

使用道具 举报

回复
论坛徽章:
76
双子座
日期:2015-07-28 14:26:072012新春纪念徽章
日期:2012-02-13 15:09:52ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15鲜花蛋
日期:2011-08-26 02:02:24管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:皮划艇
日期:2011-04-18 11:24:412011新春纪念徽章
日期:2011-02-18 11:43:342011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
47#
 楼主| 发表于 2008-4-14 15:26 | 只看该作者
原帖由 anlinew 于 2008-4-14 15:23 发表

那就要看业务逻辑了
这个貌似可以MV

呵呵 谢谢 目前系统都没用到mv 暂时先这样

使用道具 举报

回复
论坛徽章:
5
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53奥运会纪念徽章:羽毛球
日期:2008-06-23 12:00:05奥运会纪念徽章:柔道
日期:2008-07-04 09:42:36奥运会纪念徽章:皮划艇激流回旋
日期:2008-08-12 14:50:402010新春纪念徽章
日期:2010-03-01 11:19:07
48#
发表于 2008-4-14 15:26 | 只看该作者
这个用全表扫描试试

Select /*+full(f)*/ID
From tb_role f
where e.role_id = f.id
Connect By Prior Id = parent_id
Start With Id = 1
/

使用道具 举报

回复
论坛徽章:
76
双子座
日期:2015-07-28 14:26:072012新春纪念徽章
日期:2012-02-13 15:09:52ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15鲜花蛋
日期:2011-08-26 02:02:24管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:皮划艇
日期:2011-04-18 11:24:412011新春纪念徽章
日期:2011-02-18 11:43:342011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
49#
 楼主| 发表于 2008-4-14 15:30 | 只看该作者
原帖由 mihawk 于 2008-4-14 15:26 发表
这个用全表扫描试试

Select /*+full(f)*/ID
From tb_role f
where e.role_id = f.id
Connect By Prior Id = parent_id
Start With Id = 1
/


呵呵 谢谢降下来了

SQL> Select /*+full(f)*/ID
  2  From tb_admin_role f
  3  Connect By Prior Id = parent_id
  4  Start With Id = 1;

8974 rows selected.


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=8974 Bytes=80
          766)

   1    0   CONNECT BY (WITH FILTERING)
   2    1     NESTED LOOPS
   3    2       INDEX (UNIQUE SCAN) OF 'PK_TB_ADMIN_ROLE' (UNIQUE) (Co
          st=1 Card=1 Bytes=5)

   4    2       TABLE ACCESS (BY USER ROWID) OF 'TB_ADMIN_ROLE'
   5    1     HASH JOIN
   6    5       CONNECT BY PUMP
   7    5       TABLE ACCESS (FULL) OF 'TB_ADMIN_ROLE' (Cost=5 Card=89
          74 Bytes=80766)





Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        739  consistent gets          0  physical reads
          0  redo size
      97091  bytes sent via SQL*Net to client
       7004  bytes received via SQL*Net from client
        600  SQL*Net roundtrips to/from client
          9  sorts (memory)
          0  sorts (disk)
       8974  rows processed

SQL>

使用道具 举报

回复
论坛徽章:
5
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53奥运会纪念徽章:羽毛球
日期:2008-06-23 12:00:05奥运会纪念徽章:柔道
日期:2008-07-04 09:42:36奥运会纪念徽章:皮划艇激流回旋
日期:2008-08-12 14:50:402010新春纪念徽章
日期:2010-03-01 11:19:07
50#
发表于 2008-4-14 15:35 | 只看该作者
整个语句试试这个(语法等效的, 但是强制使用了hash和full table)

select /*+ordered use_hash(e x)*/
        e.id, e.role_id, e.login
from tb_user e ,
(Select /*+full(f)*/distinct ID
From tb_role f
Connect By Prior Id = parent_id
Start With Id = 1) x
where e.role_id = x.id
/

使用道具 举报

回复

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

本版积分规则 发表回复

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