楼主: viadeazhu

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

[复制链接]
论坛徽章:
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
31#
发表于 2010-6-1 13:10 | 只看该作者
workaround :利用no_merge强制命名,这时候不再做查询转换,想怎么玩都行了,qb_name一样可以

SQL> set autot trace exp
SQL>  select  *
  2     from test_1
  3    where object_id not in (select /*+ no_merge(v) NO_SWAP_JOIN_INPUTS(v) */ * from (select
  4                             object_id
  5                              from test_2
  6                             where object_id is not null
  7                             group by object_id
  8                            having count(*) = 1) v)
  9      and object_id is not null;

Execution Plan
----------------------------------------------------------

---------------------------------------------------------------------
| Id  | Operation             | Name   | Rows  | Bytes | Cost (%CPU)|
---------------------------------------------------------------------
|   0 | SELECT STATEMENT      |        |    10 |  1730 |    32   (7)|
|   1 |  HASH JOIN ANTI       |        |    10 |  1730 |    32   (7)|
|   2 |   TABLE ACCESS FULL   | TEST_1 |  4423 |   691K|    15   (0)|
|   3 |   VIEW                |        |  4424 | 57512 |    16   (7)|
|   4 |    FILTER             |        |       |       |            |
|   5 |     HASH GROUP BY     |        |  4424 | 57512 |    16   (7)|
|   6 |      TABLE ACCESS FULL| TEST_2 |  4424 | 57512 |    15   (0)|
---------------------------------------------------------------------

Note
-----
   - 'PLAN_TABLE' is old version


SQL>  select /*+ NO_SWAP_JOIN_INPUTS(@a1 v) */ *
  2     from test_1
  3    where object_id not in (select /*+ no_merge(v)  qb_name(a1) */ * from (select
  4                             object_id
  5                              from test_2
  6                             where object_id is not null
  7                             group by object_id
  8                            having count(*) = 1) v)
  9      and object_id is not null;

Execution Plan
----------------------------------------------------------

---------------------------------------------------------------------
| Id  | Operation             | Name   | Rows  | Bytes | Cost (%CPU)|
---------------------------------------------------------------------
|   0 | SELECT STATEMENT      |        |    10 |  1730 |    32   (7)|
|   1 |  HASH JOIN ANTI       |        |    10 |  1730 |    32   (7)|
|   2 |   TABLE ACCESS FULL   | TEST_1 |  4423 |   691K|    15   (0)|
|   3 |   VIEW                |        |  4424 | 57512 |    16   (7)|
|   4 |    FILTER             |        |       |       |            |
|   5 |     HASH GROUP BY     |        |  4424 | 57512 |    16   (7)|
|   6 |      TABLE ACCESS FULL| TEST_2 |  4424 | 57512 |    15   (0)|
---------------------------------------------------------------------

Note
-----
   - 'PLAN_TABLE' is old version

使用道具 举报

回复
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
32#
发表于 2010-6-1 13:33 | 只看该作者
... 为什么我还是不可以呢? 那里写错了?

MYDB@MYDB10G >explain plan for
  2  select *
  3    from t1, t2
  4   where t1.object_id = t2.object_id
  5     and t1.data_object_id < 100
  6     and t1.object_id is not null
  7     and t1.object_id not in (select /*+  NO_SWAP_JOIN_INPUTS(@SEL$683B0107 VW_NSO_1@SEL$5DA710D3) */
  8                               t3.object_id
  9                                from t3
10                               where t3.object_id is not null
11                               group by object_id, object_name
12                              having count(*) > 0)
13  /

已解释。

已用时间:  00: 00: 00.01
MYDB@MYDB10G >select * from table(dbms_xplan.display(null,null,'+alias'));

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2554849999

-----------------------------------------------------------------------------------
| Id  | Operation              | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |          |    10 |  1830 |    98   (4)| 00:00:02 |
|*  1 |  HASH JOIN             |          |    10 |  1830 |    98   (4)| 00:00:02 |
|*  2 |   HASH JOIN ANTI       |          |    10 |   980 |    52   (4)| 00:00:01 |
|*  3 |    TABLE ACCESS FULL   | T1       |    15 |  1275 |    46   (0)| 00:00:01 |
|   4 |    VIEW                | VW_NSO_1 |    16 |   208 |     5  (20)| 00:00:01 |
|*  5 |     FILTER             |          |       |       |            |          |
|   6 |      HASH GROUP BY     |          |    16 |   208 |     5  (20)| 00:00:01 |
|*  7 |       TABLE ACCESS FULL| T3       |   304 |  3952 |     4   (0)| 00:00:01 |
|   8 |   TABLE ACCESS FULL    | T2       | 11654 |   967K|    45   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$5DA710D3
   3 - SEL$5DA710D3 / T1@SEL$1
   4 - SEL$683B0107 / VW_NSO_1@SEL$5DA710D3
   5 - SEL$683B0107
   7 - SEL$683B0107 / T3@SEL$2
   8 - SEL$5DA710D3 / T2@SEL$1

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

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

已选择34行。

使用道具 举报

回复
论坛徽章:
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
33#
发表于 2010-6-1 13:37 | 只看该作者
你的oracle是哪版本的,我10.2.0.4的

使用道具 举报

回复
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
34#
发表于 2010-6-1 13:40 | 只看该作者
我上面的有错误,但是修改过来后也一样不成,10.2.0.4

MYDB@MYDB10G >select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for 32-bit Windows: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production

MYDB@MYDB10G >explain plan for
  2  select *
  3    from t1, t2
  4   where t1.object_id = t2.object_id
  5     and t1.data_object_id < 100
  6     and t1.object_id is not null
  7     and t1.object_id not in (select /*+  NO_SWAP_JOIN_INPUTS(@SEL$5DA710D3 VW_NSO_1@SEL$5DA710D3) */
  8                               t3.object_id
  9                                from t3
10                               where t3.object_id is not null
11                               group by object_id, object_name
12                              having count(*) > 0)
13  /

已解释。

MYDB@MYDB10G >select * from table(dbms_xplan.display(null,null,'+alias'));

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2554849999

-----------------------------------------------------------------------------------
| Id  | Operation              | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |          |    10 |  1830 |    98   (4)| 00:00:02 |
|*  1 |  HASH JOIN             |          |    10 |  1830 |    98   (4)| 00:00:02 |
|*  2 |   HASH JOIN ANTI       |          |    10 |   980 |    52   (4)| 00:00:01 |
|*  3 |    TABLE ACCESS FULL   | T1       |    15 |  1275 |    46   (0)| 00:00:01 |
|   4 |    VIEW                | VW_NSO_1 |    16 |   208 |     5  (20)| 00:00:01 |
|*  5 |     FILTER             |          |       |       |            |          |
|   6 |      HASH GROUP BY     |          |    16 |   208 |     5  (20)| 00:00:01 |
|*  7 |       TABLE ACCESS FULL| T3       |   304 |  3952 |     4   (0)| 00:00:01 |
|   8 |   TABLE ACCESS FULL    | T2       | 11654 |   967K|    45   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$5DA710D3
   3 - SEL$5DA710D3 / T1@SEL$1
   4 - SEL$683B0107 / VW_NSO_1@SEL$5DA710D3
   5 - SEL$683B0107
   7 - SEL$683B0107 / T3@SEL$2
   8 - SEL$5DA710D3 / T2@SEL$1

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

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

已选择34行。


我没有理解错吧~

/*+NO_SWAP_JOIN_INPUTS(@SEL$5DA710D3 VW_NSO_1@SEL$5DA710D3) */

其中@SEL$5DA710D3 是hash join这部操作的block名
VW_NSO_1@SEL$5DA710D3是那个内建的view的名字

[ 本帖最后由 zergduan 于 2010-6-1 13:43 编辑 ]

使用道具 举报

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

回复 #32 zergduan 的帖子

你的没问题啊,已经不是view那个驱动了啊

使用道具 举报

回复
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
36#
发表于 2010-6-1 13:46 | 只看该作者
我说错了。。。 明白了,谢谢~~

MYDB@MYDB10G >explain plan for
  2  select *
  3    from t1, t2
  4   where t1.object_id = t2.object_id
  5     and t1.data_object_id < 100
  6     and t1.object_id is not null
  7     and t1.object_id not in (select /*+ SWAP_JOIN_INPUTS(@SEL$5DA710D3 VW_NSO_1@SEL$5DA710D3) */
  8                               t3.object_id
  9                                from t3
10                               where t3.object_id is not null
11                               group by object_id, object_name
12                              having count(*) > 0)
13  /

已解释。

MYDB@MYDB10G >select * from table(dbms_xplan.display(null,null,'+alias'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 523363264

-----------------------------------------------------------------------------------
| Id  | Operation              | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |          |    10 |  1830 |    98   (4)| 00:00:02 |
|*  1 |  HASH JOIN             |          |    10 |  1830 |    98   (4)| 00:00:02 |
|*  2 |   HASH JOIN RIGHT ANTI |          |    10 |   980 |    52   (4)| 00:00:01 |
|   3 |    VIEW                | VW_NSO_1 |    16 |   208 |     5  (20)| 00:00:01 |
|*  4 |     FILTER             |          |       |       |            |          |
|   5 |      HASH GROUP BY     |          |    16 |   208 |     5  (20)| 00:00:01 |
|*  6 |       TABLE ACCESS FULL| T3       |   304 |  3952 |     4   (0)| 00:00:01 |
|*  7 |    TABLE ACCESS FULL   | T1       |    15 |  1275 |    46   (0)| 00:00:01 |
|   8 |   TABLE ACCESS FULL    | T2       | 11654 |   967K|    45   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$5DA710D3
   3 - SEL$683B0107 / VW_NSO_1@SEL$5DA710D3
   4 - SEL$683B0107
   6 - SEL$683B0107 / T3@SEL$2
   7 - SEL$5DA710D3 / T1@SEL$1
   8 - SEL$5DA710D3 / T2@SEL$1

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"."DATA_OBJECT_ID"<100 AND "T1"."OBJECT_ID" IS NOT NULL)

已选择34行。

[ 本帖最后由 zergduan 于 2010-6-1 13:48 编辑 ]

使用道具 举报

回复
论坛徽章:
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
37#
发表于 2010-6-1 13:48 | 只看该作者
你要想view驱动,你加swap_join_inputs试试,一个hint只能控制一层,不能做到控制多层

使用道具 举报

回复
论坛徽章:
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
38#
发表于 2010-6-1 14:21 | 只看该作者
oracle在11g里面对这几组hint的分类也是有点意思的
UNNEST                                                               QKSFM_UNNEST
NO_UNNEST                                                         QKSFM_UNNEST

PUSH_PRED                                                          QKSFM_FILTER_PUSH_PRED
NO_PUSH_PRED                                                   QKSFM_FILTER_PUSH_PRED
-- 上面两组是单独的分类了

NO_PUSH_SUBQ                                                  QKSFM_TRANSFORMATION
PUSH_SUBQ                                                         QKSFM_TRANSFORMATION

使用道具 举报

回复
论坛徽章:
0
39#
发表于 2010-7-16 20:50 | 只看该作者
好贴

使用道具 举报

回复
论坛徽章:
13
2010广州亚运会纪念徽章:轮滑
日期:2010-09-03 12:44:53马上有房
日期:2014-04-04 13:51:34马上加薪
日期:2014-04-04 13:35:40优秀写手
日期:2014-03-14 06:00:13夏利
日期:2013-08-05 18:32:18复活蛋
日期:2013-06-25 17:22:592013年新春福章
日期:2013-02-25 14:51:24蛋疼蛋
日期:2013-01-08 18:08:502011新春纪念徽章
日期:2011-02-18 11:43:33生肖徽章2007版:兔
日期:2011-01-20 12:58:49
40#
发表于 2010-8-17 00:27 | 只看该作者
学习

使用道具 举报

回复

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

本版积分规则 发表回复

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