http://www.thinkindata.com/?p=34

该hint用于子查询(query_block)   
很多的情况下,如果子查询共用相同的别名(alias), 可以通过设定不同的qb_name分别标识子查询。

实例如下

SQL*Plus: Release 10.2.0.1.0 – Production on Sat Dec 19 22:16:13 2009

。。。。。

43@dyl@TEST>EXPLAIN PLAN SET statement_id = ‘qb_name’
 FOR
     SELECT /*+ QB_NAME(outer) */
            e.ename
     ,      e.sal
     FROM (
            SELECT /*+ QB_NAME(inline_view) */
                   *
            FROM   emp e
            WHERE e.sal > 300
            AND    e.deptno IN ( SELECT /*+ QB_NAME(dept_subquery) */ d.deptno
                                 FROM   dept d
                                 WHERE d.dname IN (‘SALES’,'ACCOUNTING’) )
           ) e;

Explained.

Elapsed: 00:00:00.17

使用10g下的DBMS_XPLAN.DISPLAY,注意必须使用ALL参数,才能看得到自定义的query_block name

43@dyl@TEST>SELECT plan_table_output
 FROM   TABLE(DBMS_XPLAN.DISPLAY(‘PLAN_TABLE’,'qb_name’,’ALL‘));

PLAN_TABLE_OUTPUT
——————————————————————————————————————————————————
Plan hash value: 351108634

—————————————————————————————-
| Id | Operation                    | Name    | Rows | Bytes | Cost (%CPU)| Time     |
—————————————————————————————-
|   0 | SELECT STATEMENT             |         |     9 |   234 |     4   (0)| 00:00:01 |
|   1 | NESTED LOOPS                |         |     9 |   234 |     4   (0)| 00:00:01 |
|* 2 |   TABLE ACCESS FULL          | EMP     |    14 |   182 |     3   (0)| 00:00:01 |
|* 3 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    13 |     1   (0)| 00:00:01 |
|* 4 |    INDEX UNIQUE SCAN         | PK_DEPT |     1 |       |     0   (0)| 00:00:01 |
—————————————————————————————-

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

1 – SEL$B9DAFA34
2 – SEL$B9DAFA34 / E@INLINE_VIEW
3 – SEL$B9DAFA34 / D@DEPT_SUBQUERY
4 – SEL$B9DAFA34 / D@DEPT_SUBQUERY

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

2 – filter(“E”.”SAL”>300)
3 – filter(“D”.”DNAME”=’ACCOUNTING’ OR “D”.”DNAME”=’SALES’)
4 – access(“E”.”DEPTNO”=”D”.”DEPTNO”)

Column Projection Information (identified by operation id):
———————————————————–

1 – (#keys=0) “E”.”ENAME”[VARCHAR2,10], “E”.”SAL”[NUMBER,22]
2 – “E”.”ENAME”[VARCHAR2,10], “E”.”SAL”[NUMBER,22], “E”.”DEPTNO”[NUMBER,22]
4 – “D”.ROWID[ROWID,10]

33 rows selected.

Elapsed: 00:00:00.05
在定义了qb_name之后最大的好处就是再设定其他hint时,可以指定qb_name,

语法相对更清晰一些,在非常复杂的select语句时不易加错hint。

43@dyl@TEST>EXPLAIN PLAN SET statement_id = ‘qb_hints’
 FOR
     SELECT /*+ QB_NAME(outer) FULL(@dept_subquery d) */
            e.ename
     ,      e.sal
     FROM (
            SELECT /*+ QB_NAME(inline_view) */
                   *
            FROM   emp e
            WHERE e.sal > 300
            AND    e.deptno IN ( SELECT /*+ QB_NAME(dept_subquery) */ d.deptno
                                 FROM   dept d
                                 WHERE d.dname IN (‘SALES’,'ACCOUNTING’) )
           ) e;
Explained.

Elapsed: 00:00:00.01
43@dyl@TEST>SELECT plan_table_output
 FROM   TABLE(DBMS_XPLAN.DISPLAY(‘PLAN_TABLE’,'qb_hints’,'ALL’));

PLAN_TABLE_OUTPUT
——————————————————————————————————————————————————
Plan hash value: 615168685

—————————————————————————
| Id | Operation          | Name | Rows | Bytes | Cost (%CPU)| Time     |
—————————————————————————
|   0 | SELECT STATEMENT   |      |     9 |   234 |     7 (15)| 00:00:01 |
|* 1 | HASH JOIN         |      |     9 |   234 |     7 (15)| 00:00:01 |
|* 2 |   TABLE ACCESS FULL| DEPT |     2 |    26 |     3   (0)| 00:00:01 |
|* 3 |   TABLE ACCESS FULL| EMP |    14 |   182 |     3   (0)| 00:00:01 |
—————————————————————————

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

1 – SEL$B9DAFA34
2 – SEL$B9DAFA34 / D@DEPT_SUBQUERY
3 – SEL$B9DAFA34 / E@INLINE_VIEW

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

1 – access(“E”.”DEPTNO”=”D”.”DEPTNO”)
2 – filter(“D”.”DNAME”=’ACCOUNTING’ OR “D”.”DNAME”=’SALES’)
3 – filter(“E”.”SAL”>300)

Column Projection Information (identified by operation id):
———————————————————–

1 – (#keys=1) “E”.”ENAME”[VARCHAR2,10], “E”.”SAL”[NUMBER,22]
2 – “D”.”DEPTNO”[NUMBER,22]
3 – “E”.”ENAME”[VARCHAR2,10], “E”.”SAL”[NUMBER,22],
“E”.”DEPTNO”[NUMBER,22]

32 rows selected.

 

hint之qb_name的更多相关文章

  1. Oracle三组难缠的hint no_unnest/unnest,push_subq,push_pred--平展化(转)

    经常有人把这三个hint搞混,主如果因为对三种重写道理不清楚.特总结如下.(实验景象为10204)1. no_unnest, unnestunnest我们称为对子查询展开,顾名思义,就是别让子查询孤单 ...

  2. [转]Oracle中Hint深入理解

    原文地址:http://czmmiao.iteye.com/blog/1478465 Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明 ...

  3. 品味性能之道<十>:Oracle Hint

    Hint 是Oracle 提供的一种SQL语法,它允许用户在SQL语句中插入相关的语法,从而影响SQL的执行方式. 因为Hint的特殊作用,所以对于开发人员不应该在代码中使用它,Hint 更像是Ora ...

  4. Oracle 常见hint

    Hints 应该慎用,收集相关表的统计信息,根据执行计划,来改变查询方式 只能在SELECT, UPDATE, INSERT, MERGE, or DELETE 关键字后面,只有insert可以用2个 ...

  5. Oracle中Hint深入理解(原创)

    http://czmmiao.iteye.com/blog/1478465 Hint概述  基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明 ...

  6. Oracle中Hint深入理解

    Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比. 此时就需要DBA进行 ...

  7. 【DBAplus】SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势

    原创 2016-09-12 韩锋  作者介绍 韩锋,宜信技术研发中心数据库架构师.精通多种关系型数据库,曾任职于当当网.TOM在线等公司,曾任多家公司首席DBA.数据库架构师等职,多年一线数据库架构. ...

  8. SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势

    一.提示(Hint)概述 1为什么引入Hint? Hint是Oracle数据库中很有特色的一个功能,是很多DBA优化中经常采用的一个手段.那为什么Oracle会考虑引入优化器呢?基于代价的优化器是很聪 ...

  9. oracle中hint 详解

    Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比. 此时就需要DBA进行 ...

随机推荐

  1. MyEclipse 10 中安装Android ADT 22插件的方法

    MyEclipse 10 中安装Android ADT 22插件的方法 下载ADT包:http://dl.google.com/android/ADT-22.0.0.zip 将ADT-22.0.0.z ...

  2. 自定义页签logo

    1.webpack.prod.conf new HtmlWebpackPlugin({ filename: process.env.NODE_ENV === 'testing' ? 'index.ht ...

  3. LOJ2540. 「PKUWC2018」随机算法【概率期望DP+状压DP】

    LINK 思路 首先在加入几个点之后所有的点都只有三种状态 一个是在独立集中,一个是和独立集联通,还有一个是没有被访问过 然后前两个状态是可以压缩起来的 因为我们只需要记录下当前独立集大小和是否被访问 ...

  4. MySQL主从复制报错及解决方法

    mysql> show slave status \G *************************** 1. row *************************** Slave_ ...

  5. java设计模——反射的应用 (利用反射来去除if判断语句)

    利用反射来去除if判断语句 我的以前写的一个查分系统,就是部长让我写的那个,使用一个分发器(函数),他会根据传递进来的字符串参数调用不同的方. If(“add”.equalsIgnoreCase(fu ...

  6. IIS 使用 HTTP/2

    什么叫HTTP/2? HTTP 2.0即超文本传输协议 2.0,是下一代HTTP协议.是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis ...

  7. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop

    转载至:https://blog.csdn.net/wo541075754/article/details/75201934 no-loop 定义当前的规则是否不允许多次循环执行,默认是 false, ...

  8. 51Nod1526 分配笔名

    分析 在trie树上贪心,将所有串加入trie树中,在深度较深的地方匹配会更优. 由于只需要知道最后的总质量,所以直接取每个点的子树中最大的匹配即可 复杂度\(O(\sum len)\) 加串的时候把 ...

  9. vue数据传递的特殊实现技巧

    最近碰到了比较多的关于vue的eventBus的问题,之前定技术选型的时候也被问到了,vuex和eventBus的使用范围.所以简单的写一下.同时有一种特殊的实现方案. 有这么几种数据传递方式,vue ...

  10. 转 Apache Kafka:下一代分布式消息系统

    简介 Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和可复制的提交 ...