楼主: viadeazhu

[精华] CBO hint:no_unnest,push_subq,push_pred的用法

[复制链接]
论坛徽章:
86
2015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11优秀写手
日期:2013-12-18 09:29:11日产
日期:2013-10-17 08:44:39马自达
日期:2013-08-26 16:28:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:51马上有房
日期:2014-02-19 11:55:14
11#
发表于 2010-5-29 20:48 | 只看该作者
好!!!总结的好。

使用道具 举报

回复
论坛徽章:
81
青年奥林匹克运动会-马术
日期:2014-09-10 21:37:07奥运会纪念徽章:跳水
日期:2012-09-22 18:27:58奥运会纪念徽章:现代五项
日期:2012-09-07 17:33:44奥运会纪念徽章:铁人三项
日期:2012-06-15 21:27:24版主1段
日期:2012-05-15 15:24:11蜘蛛蛋
日期:2012-05-14 10:50:40灰彻蛋
日期:2012-03-06 19:24:222012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:09ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:37
12#
发表于 2010-5-31 20:57 | 只看该作者
great !

使用道具 举报

回复
招聘 : 系统架构师
论坛徽章:
372
双子座
日期:2015-08-18 12:18:21摩羯座
日期:2015-09-20 17:10:27秀才
日期:2015-09-21 09:46:16秀才
日期:2015-09-21 11:16:42秀才
日期:2015-10-08 17:57:58天枰座
日期:2015-10-28 18:28:29秀才
日期:2015-11-11 09:48:44秀才
日期:2015-11-11 10:07:14秀才
日期:2015-11-11 10:22:49秀才
日期:2015-09-11 10:43:06
13#
发表于 2010-5-31 21:08 | 只看该作者

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
32
生肖徽章2007版:狗
日期:2009-07-20 17:10:18茶鸡蛋
日期:2013-05-23 16:34:43茶鸡蛋
日期:2013-07-19 14:39:22ITPUB社区千里马徽章
日期:2013-08-22 09:58:03雪铁龙
日期:2013-08-23 13:04:11林肯
日期:2013-09-04 14:07:20兰博基尼
日期:2013-09-16 13:45:20马上有钱
日期:2014-05-14 14:07:392014年世界杯参赛球队: 波黑
日期:2014-07-03 13:24:39马上有对象
日期:2014-10-30 14:04:32
14#
发表于 2010-5-31 23:31 | 只看该作者
楼主总结的很好,学习一下!

使用道具 举报

回复
招聘 : 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
15#
发表于 2010-6-1 10:11 | 只看该作者
好帖沉这么快
mark一下,呵呵

使用道具 举报

回复
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
16#
发表于 2010-6-1 10:38 | 只看该作者
借地方 问一下
hash anti right join和hash anti join如何控制

比如
1。这样的SQL可以通过push_subq来优化
MYDB@MYDB10G >select *
  2    from t1, t2
  3   where t1.object_id = t2.object_id
  4     --and t1.object_id is not null
  5     and t1.object_id not in (select t3.object_id
  6                                from t3
  7                               --where t3.object_id is not null
  8                               group by object_id, object_name
  9                              having count(*) > 0)
10  /
已用时间:  00: 00: 02.06

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

-------------------------------------------------------------------------------------
| Id  | Operation            | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |      | 11653 |  1934K|       | 29406  (21)| 00:05:53 |
|*  1 |  FILTER              |      |       |       |       |            |          |
|*  2 |   HASH JOIN          |      | 11654 |  1934K|  1104K|   200   (1)| 00:00:03 |
|   3 |    TABLE ACCESS FULL | T2   | 11654 |   967K|       |    45   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL | T1   | 11845 |   983K|       |    46   (0)| 00:00:01 |
|*  5 |   FILTER             |      |       |       |       |            |          |
|   6 |    HASH GROUP BY     |      |     1 |    13 |       |     5  (20)| 00:00:01 |
|   7 |     TABLE ACCESS FULL| T3   |   304 |  3952 |       |     4   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

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

   1 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "T3" "T3" GROUP BY
              "OBJECT_ID","OBJECT_NAME" HAVING LNNVL("OBJECT_ID"<>:B1) AND COUNT(*)>0))
   2 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
   5 - filter(LNNVL("OBJECT_ID"<>:B1) AND COUNT(*)>0)

2。但是如果把subquery和parentquery的连接建加上not null,就可以使用hash join anti or hash join right anti

我尝试了各种方法,都没法控制到底是用hash join anti 还是 hash join right anti~ 也就是是否使用内建的view作为驱动表~

包括 ordered, leading @squb,t1,t3。。。。

请问对于下面的查询,如何控制呢?
MYDB@MYDB10G >select *
  2    from t1, t2
  3   where t1.object_id = t2.object_id
  4     and t1.object_id is not null
  5     and t1.object_id not in (select t3.object_id
  6                                from t3
  7                               where t3.object_id is not null
  8                               group by object_id, object_name
  9                              having count(*) > 0)
10  /
已用时间:  00: 00: 00.01

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

------------------------------------------------------------------------------------------
| Id  | Operation             | Name     | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |          | 11638 |  2079K|       |   206   (2)| 00:00:03 |
|*  1 |  HASH JOIN RIGHT ANTI |          | 11638 |  2079K|       |   206   (2)| 00:00:03 |
|   2 |   VIEW                | VW_NSO_1 |    16 |   208 |       |     5  (20)| 00:00:01 |
|*  3 |    FILTER             |          |       |       |       |            |          |
|   4 |     HASH GROUP BY     |          |    16 |   208 |       |     5  (20)| 00:00:01 |
|*  5 |      TABLE ACCESS FULL| T3       |   304 |  3952 |       |     4   (0)| 00:00:01 |
|*  6 |   HASH JOIN           |          | 11654 |  1934K|  1104K|   200   (1)| 00:00:03 |
|   7 |    TABLE ACCESS FULL  | T2       | 11654 |   967K|       |    45   (0)| 00:00:01 |
|*  8 |    TABLE ACCESS FULL  | T1       | 11845 |   983K|       |    46   (0)| 00:00:01 |
------------------------------------------------------------------------------------------

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

   1 - access("T1"."OBJECT_ID"="$nso_col_1")
   3 - filter(COUNT(*)>0)
   5 - filter("T3"."OBJECT_ID" IS NOT NULL)
   6 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
   8 - filter("T1"."OBJECT_ID" IS NOT NULL)

使用道具 举报

回复
招聘 : 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
17#
发表于 2010-6-1 11:18 | 只看该作者
SQL> alter system set optimizer_features_enable='11.2.0.1';

系统已更改。

SQL> select  * from test_obj1 a
  2  where a.object_id not in (select object_id from test_obj2);

已选择12172行。


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

--------------------------------------------------------------------------------
-----

| Id  | Operation               | Name      | Rows  | Bytes | Cost (%CPU)| Time
    |

--------------------------------------------------------------------------------
-----

|   0 | SELECT STATEMENT        |           | 12197 |  1107K|    57   (2)| 00:00
:01 |

|*  1 |  HASH JOIN RIGHT ANTI NA|           | 12197 |  1107K|    57   (2)| 00:00
:01 |

|   2 |   TABLE ACCESS FULL     | TEST_OBJ2 |  1000 |  4000 |     5   (0)| 00:00
:01 |

|   3 |   TABLE ACCESS FULL     | TEST_OBJ1 | 13171 |  1144K|    51   (0)| 00:00
:01 |

--------------------------------------------------------------------------------
-----


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

   1 - access("A"."OBJECT_ID"="OBJECT_ID")


统计信息
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        993  consistent gets
          0  physical reads
          0  redo size
     556288  bytes sent via SQL*Net to client
       9337  bytes received via SQL*Net from client
        813  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      12172  rows processed

SQL> alter system set optimizer_features_enable='10.2.0.1';

系统已更改。

SQL> select  * from test_obj1 a
  2  where a.object_id not in (select object_id from test_obj2);

已选择12172行。


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

--------------------------------------------------------------------------------
| Id  | Operation          | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |           | 13170 |  1144K| 33078   (1)| 00:06:37 |
|*  1 |  FILTER            |           |       |       |            |          |
|   2 |   TABLE ACCESS FULL| TEST_OBJ1 | 13171 |  1144K|    51   (0)| 00:00:01 |
|*  3 |   TABLE ACCESS FULL| TEST_OBJ2 |     1 |     4 |     5   (0)| 00:00:01 |
--------------------------------------------------------------------------------

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

   1 - filter( NOT EXISTS (SELECT 0 FROM "TEST_OBJ2" "TEST_OBJ2" WHERE
              LNNVL("OBJECT_ID"<>:B1)))
   3 - filter(LNNVL("OBJECT_ID"<>:B1))


统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
     205899  consistent gets
          0  physical reads
          0  redo size
     556288  bytes sent via SQL*Net to client
       9337  bytes received via SQL*Net from client
        813  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      12172  rows processed

使用道具 举报

回复
论坛徽章:
19
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:06:13BLOG每日发帖之星
日期:2010-03-28 01:01:02ITPUB9周年纪念徽章
日期:2010-10-08 09:31:222012新春纪念徽章
日期:2012-01-04 11:51:22
18#
发表于 2010-6-1 11:23 | 只看该作者
oracle优化器也是越来越强悍啊

使用道具 举报

回复
论坛徽章:
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
19#
发表于 2010-6-1 11:31 | 只看该作者

回复 #16 zergduan 的帖子

试试swap_joins

使用道具 举报

回复
论坛徽章:
113
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:42:50现任管理团队成员
日期:2011-05-07 01:45:08ITPUB官方微博粉丝徽章
日期:2011-06-28 19:45:36蛋疼蛋
日期:2011-07-24 22:25:332012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25
20#
 楼主| 发表于 2010-6-1 11:33 | 只看该作者
针对zerg的问题,有个很有趣的结果:
如果你select t1.*,那么t3 t1会先做hash_aj,然后再t2.
如果你select t2.*, 那么t3 t2会先做hash_aj,然后再t1.

select *
from t1, t2
where t1.object_id = t2.object_id
  and t1.object_id is not null
  and t1.object_id not in (select t3.object_id
                             from t3
                            where t3.object_id is not null
                            group by object_id, object_name
                           having count(*) > 0);

Plan hash value: 4008314795
------------------------------------------------------------------------------------------
| Id  | Operation             | Name     | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |          | 34527 |  5833K|       |   670   (4)| 00:00:07 |
|*  1 |  HASH JOIN RIGHT ANTI |          | 34527 |  5833K|       |   670   (4)| 00:00:07 |
|   2 |   VIEW                | VW_NSO_1 |  1818 | 23634 |       |   131   (7)| 00:00:02 |
|*  3 |    FILTER             |          |       |       |       |            |          |
|   4 |     HASH GROUP BY     |          |  1818 | 36360 |       |   131   (7)| 00:00:02 |
|*  5 |      TABLE ACCESS FULL| T3       | 36347 |   709K|       |   125   (2)| 00:00:02 |
|*  6 |   HASH JOIN           |          | 36345 |  5678K|  3272K|   537   (3)| 00:00:06 |
|   7 |    TABLE ACCESS FULL  | T2       | 36347 |  2839K|       |   127   (4)| 00:00:02 |
|*  8 |    TABLE ACCESS FULL  | T1       | 36346 |  2839K|       |   127   (4)| 00:00:02 |
------------------------------------------------------------------------------------------

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

   1 - access("T1"."OBJECT_ID"="$nso_col_1")
   3 - filter(COUNT(*)>0)
   5 - filter("T3"."OBJECT_ID" IS NOT NULL)
   6 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
   8 - filter("T1"."OBJECT_ID" IS NOT NULL)




select t1.*
from t1, t2
where t1.object_id = t2.object_id
  and t1.object_id is not null
  and t1.object_id not in (select t3.object_id
                             from t3
                            where t3.object_id is not null
                            group by object_id, object_name
                           having count(*) > 0);


Plan hash value: 3043464937
-----------------------------------------------------------------------------------
| Id  | Operation              | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |          | 34527 |  3270K|   387   (5)| 00:00:04 |
|*  1 |  HASH JOIN             |          | 34527 |  3270K|   387   (5)| 00:00:04 |
|   2 |   TABLE ACCESS FULL    | T2       | 36347 |   141K|   125   (2)| 00:00:02 |
|*  3 |   HASH JOIN RIGHT ANTI |          | 34528 |  3135K|   259   (6)| 00:00:03 |
|   4 |    VIEW                | VW_NSO_1 |  1818 | 23634 |   131   (7)| 00:00:02 |
|*  5 |     FILTER             |          |       |       |            |          |
|   6 |      HASH GROUP BY     |          |  1818 | 36360 |   131   (7)| 00:00:02 |
|*  7 |       TABLE ACCESS FULL| T3       | 36347 |   709K|   125   (2)| 00:00:02 |
|*  8 |    TABLE ACCESS FULL   | T1       | 36346 |  2839K|   127   (4)| 00:00:02 |
-----------------------------------------------------------------------------------

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

   1 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
   3 - access("T1"."OBJECT_ID"="$nso_col_1")
   5 - filter(COUNT(*)>0)
   7 - filter("T3"."OBJECT_ID" IS NOT NULL)
   8 - filter("T1"."OBJECT_ID" IS NOT NULL)


select t2.*
from t1, t2
where t1.object_id = t2.object_id
  and t1.object_id is not null
  and t1.object_id not in (select t3.object_id
                             from t3
                            where t3.object_id is not null
                            group by object_id, object_name
                           having count(*) > 0);


Plan hash value: 523046018
-----------------------------------------------------------------------------------
| Id  | Operation              | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |          | 34527 |  3270K|   387   (5)| 00:00:04 |
|*  1 |  HASH JOIN             |          | 34527 |  3270K|   387   (5)| 00:00:04 |
|*  2 |   HASH JOIN RIGHT ANTI |          | 34528 |   573K|   258   (5)| 00:00:03 |
|   3 |    VIEW                | VW_NSO_1 |  1818 | 23634 |   131   (7)| 00:00:02 |
|*  4 |     FILTER             |          |       |       |            |          |
|   5 |      HASH GROUP BY     |          |  1818 | 36360 |   131   (7)| 00:00:02 |
|*  6 |       TABLE ACCESS FULL| T3       | 36347 |   709K|   125   (2)| 00:00:02 |
|*  7 |    TABLE ACCESS FULL   | T1       | 36346 |   141K|   125   (2)| 00:00:02 |
|   8 |   TABLE ACCESS FULL    | T2       | 36347 |  2839K|   127   (4)| 00:00:02 |
-----------------------------------------------------------------------------------

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

   1 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
   2 - access("T1"."OBJECT_ID"="$nso_col_1")
   4 - filter(COUNT(*)>0)
   6 - filter("T3"."OBJECT_ID" IS NOT NULL)
   7 - filter("T1"."OBJECT_ID" IS NOT NULL)

24 rows selected.

使用道具 举报

回复

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

本版积分规则 发表回复

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