12
返回列表 发新帖
楼主: cwjl11

一个执行计划的问题

[复制链接]
论坛徽章:
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
11#
发表于 2010-8-4 15:03 | 只看该作者
原帖由 anlinew 于 2010-8-4 13:33 发表

同意你的说法

不过你再仔细看看我给的两条sql,这里hints只是为了强制CBO做转换,实际上因为有了group by,这里的hints并没能生效,而没有group by时,不用hints CBO也能做转换的

另外,对于楼主当前的问题,sorts并非这里问题的关键,这里的group by并不会带来更多的sort





delete from test_filter_hash t1
where created <(select /*+unnest*/ max(created) from test_filter_hash t2 where t2.id=t1.id);


2个 sorts (memory)  这里为什么会有2个排序呢?


使用道具 举报

回复
招聘 : 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
12#
发表于 2010-8-4 15:56 | 只看该作者
原帖由 zergduan 于 2010-8-4 14:05 发表


... 不是说group by 在_complex_view_merging=true的时候,也可以merge的么?
怎么这里不可以?

这个。。。。
我们猜想一下写CBO那部分代码的程序员是怎么做的吧
我认为oracle实际在做这些merging的时候,可能为了尽量不对系统造成较大影响,可能只是在为那部分代码增加了一些分支,比如当出现
a.id in (select .....group by ....)时merging
这也符合我们通常出补丁的做法,呵呵


SQL> select * from test_filter_hash t1
  2  where created in (select  max(created) from test_filter_hash t2 where t2.id=t1.id
  3  GROUP BY id
  4  );

已选择999行。


执行计划
----------------------------------------------------------
Plan hash value: 2768489654

------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                  |     1 |    33 |    10  (30)| 00:00:01 |
|   1 |  NESTED LOOPS               |                  |     1 |    33 |    10  (30)| 00:00:01 |
|   2 |   VIEW                      | VW_SQ_1          |  1078 | 22638 |     8  (25)| 00:00:01 |
|   3 |    HASH UNIQUE              |                  |     1 | 36652 |            |          |
|*  4 |     HASH JOIN               |                  |  1078 | 36652 |     8  (25)| 00:00:01 |
|   5 |      TABLE ACCESS FULL      | TEST_FILTER_HASH |  1078 | 12936 |     3   (0)| 00:00:01 |
|   6 |      VIEW                   | VW_GBD_4         |   999 | 21978 |     4  (25)| 00:00:01 |
|   7 |       HASH GROUP BY         |                  |   999 | 11988 |     4  (25)| 00:00:01 |
|   8 |        TABLE ACCESS FULL    | TEST_FILTER_HASH |  1078 | 12936 |     3   (0)| 00:00:01 |
|*  9 |   TABLE ACCESS BY USER ROWID| TEST_FILTER_HASH |     1 |    12 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("ITEM_1"="T1"."ID")
   9 - filter("CREATED"="MAX(CREATED)")


统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        261  consistent gets


[ 本帖最后由 anlinew 于 2010-8-4 15:58 编辑 ]

使用道具 举报

回复
招聘 : 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
13#
发表于 2010-8-4 16:07 | 只看该作者

SQL> select/*+ optimizer_features_enable('10.2.0.4')*/ * from test_filter_hash t1
  2  where created in (select  max(created) from test_filter_hash t2 where t2.id=t1.id
  3  GROUP BY id
  4  );

已选择999行。


执行计划
----------------------------------------------------------
Plan hash value: 2892159413

------------------------------------------------------------------------------------------
| Id  | Operation             | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                  |     1 |    33 |    11  (19)| 00:00:01 |
|*  1 |  HASH JOIN SEMI       |                  |     1 |    33 |    11  (19)| 00:00:01 |
|   2 |   TABLE ACCESS FULL   | TEST_FILTER_HASH |  1078 | 12936 |     3   (0)| 00:00:01 |
|   3 |   VIEW                | VW_SQ_1          |   999 | 20979 |     8  (25)| 00:00:01 |
|   4 |    HASH GROUP BY      |                  |   999 | 23976 |     8  (25)| 00:00:01 |
|*  5 |     HASH JOIN         |                  |  1163 | 27912 |     7  (15)| 00:00:01 |
|   6 |      TABLE ACCESS FULL| TEST_FILTER_HASH |  1078 | 12936 |     3   (0)| 00:00:01 |
|   7 |      TABLE ACCESS FULL| TEST_FILTER_HASH |  1078 | 12936 |     3   (0)| 00:00:01 |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("CREATED"="MAX(CREATED)" AND "ITEM_1"=ROWID)
   5 - access("T2"."ID"="T1"."ID")


统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
         21  consistent gets

SQL> select/*+ optimizer_features_enable('10.2.0.4')*/ * from test_filter_hash t1
  2  where created = (select  max(created) from test_filter_hash t2 where t2.id=t1.id
  3  GROUP BY id
  4  );

已选择999行。


执行计划
----------------------------------------------------------
Plan hash value: 4236364659

------------------------------------------------------------------------------------------
| Id  | Operation             | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                  |     1 |    12 |  1626   (1)| 00:00:20 |
|*  1 |  FILTER               |                  |       |       |            |          |
|   2 |   TABLE ACCESS FULL   | TEST_FILTER_HASH |  1078 | 12936 |     3   (0)| 00:00:01 |
|   3 |   SORT GROUP BY NOSORT|                  |     1 |    12 |     3   (0)| 00:00:01 |
|*  4 |    TABLE ACCESS FULL  | TEST_FILTER_HASH |     1 |    12 |     3   (0)| 00:00:01 |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("CREATED"= (SELECT MAX("CREATED") FROM "TEST_FILTER_HASH" "T2"
              WHERE "T2"."ID"=:B1 GROUP BY "ID"))
   4 - filter("T2"."ID"=:B1)


统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
       7066  consistent gets
          0  physical reads
          0  redo size
      17790  bytes sent via SQL*Net to client
       1141  bytes received via SQL*Net from client
         68  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
        999  rows processed


[ 本帖最后由 anlinew 于 2010-8-4 16:11 编辑 ]

使用道具 举报

回复
论坛徽章:
4
紫蛋头
日期:2011-06-30 09:52:10ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22咸鸭蛋
日期:2012-04-19 16:07:532013年新春福章
日期:2013-02-25 14:51:24
14#
 楼主| 发表于 2010-8-16 22:37 | 只看该作者
谢谢大家。。。好久没来了。。嗯 那个group by 的确是没必要加,只是当时加后发现执行计划改变了,所以问下大家是为什么。再次感谢。。。。

使用道具 举报

回复
论坛徽章:
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
15#
发表于 2010-11-19 19:06 | 只看该作者
原帖由 anlinew 于 2010-8-4 15:56 发表

这个。。。。
我们猜想一下写CBO那部分代码的程序员是怎么做的吧
我认为oracle实际在做这些merging的时候,可能为了尽量不对系统造成较大影响,可能只是在为那部分代码增加了一些分支,比如当出现
a.id in (select .....group by ....)时merging
这也符合我们通常出补丁的做法,呵呵


SQL> select * from test_filter_hash t1
  2  where created in (select  max(created) from test_filter_hash t2 where t2.id=t1.id
  3  GROUP BY id
  4  );

已选择999行。


执行计划
----------------------------------------------------------
Plan hash value: 2768489654

------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                  |     1 |    33 |    10  (30)| 00:00:01 |
|   1 |  NESTED LOOPS               |                  |     1 |    33 |    10  (30)| 00:00:01 |
|   2 |   VIEW                      | VW_SQ_1          |  1078 | 22638 |     8  (25)| 00:00:01 |
|   3 |    HASH UNIQUE              |                  |     1 | 36652 |            |          |
|*  4 |     HASH JOIN               |                  |  1078 | 36652 |     8  (25)| 00:00:01 |
|   5 |      TABLE ACCESS FULL      | TEST_FILTER_HASH |  1078 | 12936 |     3   (0)| 00:00:01 |
|   6 |      VIEW                   | VW_GBD_4         |   999 | 21978 |     4  (25)| 00:00:01 |
|   7 |       HASH GROUP BY         |                  |   999 | 11988 |     4  (25)| 00:00:01 |
|   8 |        TABLE ACCESS FULL    | TEST_FILTER_HASH |  1078 | 12936 |     3   (0)| 00:00:01 |
|*  9 |   TABLE ACCESS BY USER ROWID| TEST_FILTER_HASH |     1 |    12 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("ITEM_1"="T1"."ID")
   9 - filter("CREATED"="MAX(CREATED)")


统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        261  consistent gets




in 和= 在10.2.0.4下会导致执行计划不同, 这个版本下呢?

使用道具 举报

回复
论坛徽章:
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
16#
发表于 2010-11-19 19:07 | 只看该作者
难道11g会改用nest loop 了?

使用道具 举报

回复

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

本版积分规则 发表回复

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