`
bianxq
  • 浏览: 94196 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

push_subq提示

阅读更多

PUSH_SUBQ 可以用来控制子查询的执行 这个是PUSH_SUBQ 的本意

我那个例子的意思是说:

PUSH_SUBQ 本质上是个CBOhints(当然RBO也提不上hints)

由于PUSH_SUBQ 的引入就是为了来解决unnesting的某些不足

所以在不同的版本上,这个hints发挥的作用也有所不同了.

 

8i上这个提示的作用更接近本原:

 

$ sqlplus "/ as sysdba"

SQL*Plus: Release 8.1.5.0.0 - Production on Sun Sep 12 20:51:21 2004

(c) Copyright 1999 Oracle Corporation.  All rights reserved.

Connected to:

Oracle8i Enterprise Edition Release 8.1.5.0.0 - Production

With the Partitioning and Java options

PL/SQL Release 8.1.5.0.0 - Production

 

SQL> connect scott/tiger

Connected.

SQL> create table dept1 as select * from dept;

Table created.

 

SQL> set linesize 120

SQL> select a.*     

  2  from emp a,dept b where a.deptno = b.deptno and exists (select 1 from dept1 where dept1.dname = b.dname);

 

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

 

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

 

14 rows selected.

 

 

Execution Plan

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

   0      SELECT STATEMENT ptimizer=CHOOSE

   1    0   FILTER ---------------'最初push_subq的使命是为了消除/提高这个filter的效率的'

   2    1     NESTED LOOPS

   3    2       TABLE ACCESS (FULL) OF 'EMP'

   4    2       TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'

   5    4         INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)

   6    1     TABLE ACCESS (FULL) OF 'DEPT1'

 

 

Statistics

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

          0  recursive calls

         52  db block gets

         21  consistent gets

          0  physical reads

          0  redo size

       2715  bytes sent via SQL*Net to client

        751  bytes received via SQL*Net from client

          4  SQL*Net roundtrips to/from client

          1  sorts (memory)

          0  sorts (disk)

         14  rows processed

 

 

用于push_subq是个CBO hints,这里我们可以看到COST的出现:

 

 

SQL> select /*+ push_subq */ a.*

  2  from emp a,dept b where a.deptno = b.deptno and exists (select 1 from dept1 where dept1.dname = b.dname);

 

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

 

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

 

14 rows selected.

 

 

Execution Plan

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

   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=3 Card=1 Bytes=122)

   1    0   NESTED LOOPS (Cost=3 Card=1 Bytes=122)

   2    1     TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=2 Bytes=44)

   3    2       TABLE ACCESS (FULL) OF 'DEPT1' (Cost=1 Card=1 Bytes=9)--------'这里消除了之前的filter'

   4    1     TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=21 Bytes=2100)

 

 

Statistics

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

        204  recursive calls

         85  db block gets

         38  consistent gets

          0  physical reads

          0  redo size

       2706  bytes sent via SQL*Net to client

        768  bytes received via SQL*Net from client

          4  SQL*Net roundtrips to/from client

          5  sorts (memory)

          0  sorts (disk)

         14  rows processed

 

再看CBO:

 

正常情况下,没什么好说的:

 

 

SQL> set autotrace traceonly

SQL> exec dbms_stats.gather_schema_stats('SCOTT')

 

PL/SQL procedure successfully completed.

 

SQL> select a.*

  2  from emp a,dept b where a.deptno = b.deptno and exists (select 1 from dept1 where dept1.dname = b.dname);

 

14 rows selected.

 

 

Execution Plan

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

   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=5 Bytes=275)

   1    0   FILTER

   2    1     NESTED LOOPS (Cost=2 Card=5 Bytes=275)

   3    2       TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=1 Bytes=18)

   4    2       TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=14 Bytes=518)

   5    1     TABLE ACCESS (FULL) OF 'DEPT1' (Cost=1 Card=1 Bytes=9)

 

 

Statistics

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

         39  recursive calls

         68  db block gets

         21  consistent gets

          0  physical reads

          0  redo size

       2708  bytes sent via SQL*Net to client

        751  bytes received via SQL*Net from client

          4  SQL*Net roundtrips to/from client

          1  sorts (memory)

          0  sorts (disk)

         14  rows processed

 

CBOpush_subq发挥了同样的作用:

 

SQL> select /*+ push_subq */ a.*

  2  from emp a,dept b where a.deptno = b.deptno and exists (select 1 from dept1 where dept1.dname = b.dname);

 

14 rows selected.

 

Execution Plan

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

   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=5 Bytes=275)

   1    0   NESTED LOOPS (Cost=2 Card=5 Bytes=275)

   2    1     TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=1 Bytes=18)

   3    2       TABLE ACCESS (FULL) OF 'DEPT1' (Cost=1 Card=1 Bytes=9)---'注意这里'

   4    1     TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=14 Bytes=518)

 

Statistics

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

          0  recursive calls

         84  db block gets

         11  consistent gets

          0  physical reads

          0  redo size

       2709  bytes sent via SQL*Net to client

        768  bytes received via SQL*Net from client

          4  SQL*Net roundtrips to/from client

          1  sorts (memory)

          0  sorts (disk)

         14  rows processed

 

而在Oracle9i之中:

 

[oracle@jumper oracle]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.3.0 - Production on Sun Sep 12 21:42:57 2004

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Connected to:

Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production

With the Partitioning, OLAP and Oracle Data Mining options

JServer Release 9.2.0.3.0 - Production

 

SQL> connect scott/tiger

Connected.

SQL> set linesize 120

SQL> set autotrace traceonly

SQL> select a.*

  2  from emp a,dept b where a.deptno = b.deptno and exists (select 1 from dept1 where dept1.dname = b.dname);

11 rows selected.

 

Execution Plan

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

   0      SELECT STATEMENT ptimizer=CHOOSE

   1    0   FILTER

   2    1     NESTED LOOPS

   3    2       TABLE ACCESS (FULL) OF 'EMP'

   4    2       TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'

   5    4         INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)

   6    1     TABLE ACCESS (FULL) OF 'DEPT1'

 

Statistics

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

          0  recursive calls

          0  db block gets

         26  consistent gets

          0  physical reads

          0  redo size

       1164  bytes sent via SQL*Net to client

        503  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

         11  rows processed

 

SQL> select /*+ push_subq */ a.*

  2  from emp a,dept b where a.deptno = b.deptno and exists (select 1 from dept1 where dept1.dname = b.dname);

 

11 rows selected.

 

Execution Plan

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

   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=8 Card=82 Bytes=9676)

   1    0   HASH JOIN (SEMI) (Cost=8 Card=82 Bytes=9676)

   2    1     HASH JOIN (Cost=5 Card=82 Bytes=8938)

   3    2       TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=82 Bytes=7134)

   4    2       TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=82 Bytes=1804)

   5    1     TABLE ACCESS (FULL) OF 'DEPT1' (Cost=2 Card=82 Bytes=738)

 

Statistics

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

          0  recursive calls

          0  db block gets

         10  consistent gets

          0  physical reads

          0  redo size

       1195  bytes sent via SQL*Net to client

        503  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

         11  rows processed

 

SQL> exec dbms_stats.gather_schema_stats('scott')

 

PL/SQL procedure successfully completed.

 

SQL> select a.*

  2  from emp a,dept b where a.deptno = b.deptno and exists (select 1 from dept1 where dept1.dname = b.dname);

11 rows selected.

 

Execution Plan

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

   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=8 Card=11 Bytes=682)

   1    0   HASH JOIN (SEMI) (Cost=8 Card=11 Bytes=682)

   2    1     HASH JOIN (Cost=5 Card=11 Bytes=572)

   3    2       TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=4 Bytes=52)

   4    2       TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=11 Bytes=429)

   5    1     TABLE ACCESS (FULL) OF 'DEPT1' (Cost=2 Card=4 Bytes=40)

Cou

分享到:
评论

相关推荐

    opnet 点对点例子

    在IT行业中,网络建模与仿真工具是至关重要的,它们帮助我们理解网络性能,优化设计并预测潜在问题。OPNET(Optimized Network Engineering Tool)就是这样一款强大的工具,它提供了详尽的网络性能分析和建模功能。...

    实战Oracle SQL调优 hint特性

    - `NO_PUSH_SUBQ`:指示不将子查询下推到表访问操作。 - `PX_JOIN_FILTER`:指示并行执行时的连接过滤。 - `NO_PX_JOIN_FILTER`:指示并行执行时不使用连接过滤。 - `NO_XML_QUERY_REWRITE`:指示不进行XML查询...

    查看存储过程执行情况

    3. **索引提示**:查询开头的`/*+ PUSH_SUBQ */`是一个索引提示,它告诉数据库优化器如何处理子查询,以提高查询性能。 ### 结论 通过上述SQL查询,我们可以有效地监控和分析数据库中存储过程的执行情况及其对系统...

    关于oracle的sql优化资料

    - **PUSH_JOIN_PRED(v)** 和 **NO_PUSH_JOIN_PRED(v)**: 控制JOIN谓词是否推入视图。 ##### 5. 读取方式 - **FULL(tab)**: 对表执行全表扫描。 - **CACHE(tab)**: 如果表大小小于`CACHE_SIZE_THRESHOLD`参数设置的...

    oralce 维护常用sql语句

    - **注意事项**: 使用了提示`/*+PUSH_SUBQ*/`来优化查询性能,并通过输入参数`&sid`来指定查询的会话SID。 ### 4. 查询对象被访问的情况 **SQL语句**: ```sql SELECT p.Spid, s.Sid, s.Serial# Serial_Num, s....

    opnet 核心函数中文版

    4. **对象优先原则**:在函数名中,对象名称总是放在动作之前,如`attr_set`表示设置属性(`attr`),`subq_flush`表示清空子队列(`subq`)。 ##### 1.2 参数类型 OPNET中的核心函数使用的参数类型除了标准的C/C++...

    OPNET_Modeler核心函数

    例如,`op_subq_create()`用于创建一个新的子队列,`op_subq_delete()`用于删除一个子队列。 **2.12 统计量函数集** 统计量函数集提供了创建、更新和查询统计数据的方法。例如,`op_stat_create()`用于创建一个新...

    Bug 19523291 Subquery unnesting does not happen(Doc ID 19523291.8).pdf

    对于可能遇到该bug的用户,文档提供了一个解决方案:为了避免ORA-1790错误,可以将初始化参数"_optimizer_unnest_corr_set_subq"设置为FALSE。这可以作为一种避免错误的方法,但请注意这不一定能解决所有性能问题,...

    Oracle数据库维护常用SQL语句集合

    SELECT /*+PUSH_SUBQ*/ Command_Type, Sql_Text, Sharable_Mem, Persistent_Mem, Runtime_Mem, Sorts, Version_Count, Loaded_Versions, Open_Versions, Users_Opening, Executions, Users_Executing, Loads, ...

    opnet核心函数

    - **对象与动作**:在函数命名中,对象通常放在动作之前,例如 `attr_set` 和 `subq_flush`,其中 `attr` 和 `subq` 是操作的对象,`set` 和 `flush` 是执行的动作。 ##### 1.2 参数类型 OPNET Modeler 提供了一...

    Subq3-Text:基于Solarized和Soda的SublimeText配置

    #Subq3Text-基于日晒和苏打的SublimeText 2配置 在Subq3Text存储库中是我的SublimeText配置。 它为SublimeText使用了和。 ## Installation以下内容会将此存储库的文件克隆到~/Library/Application Support/Sublime...

    OPNET Modeler核心函数

    子队列函数集处理子队列的管理,如`op_subq_create()`用于创建新的子队列。 **2.12 统计量函数集** 统计量函数集用于收集和报告仿真过程中的统计信息,如`op_stat_create()`用于创建新的统计量。 以上概述了OPNET...

    sqlalchemy

    以下教程采用 doctest 格式,即每行 `>>>` 表示可以在 Python 命令提示符下输入的内容,随后的文本代表预期的返回值。 #### SQLAlchemy 文档概览 **版本**:0.7.4 **作者**:Mike Bayer **发布日期**:2012 年 1 ...

    sqlalchemy官方文档

    subq = session.query(Address.email_address).filter(Address.user_id == User.id).subquery() users = session.query(User).filter(User.name.in_(subq)).all() ``` - **使用 EXISTS** - 检查是否存在满足...

    compro4_2_1.md

    - 通过 `subq $32, %rsp` 分配了32个字节的栈空间,用于存储局部变量。 5. 字符串与数据段: - `.LC0` 定义了一个标签,用于引用字符串常量 "computer"。 - `.section .rodata` 定义了一个只读数据段,其中存放...

    深入理解计算机系统练习题3.8理解计算机二元操作.pdf

    本资源为计算机系统练习题,主要讲解计算机二元操作,通过解决一道练习题,讲解了寄存器寻址、寄存器间接寻址、基址加偏移量寻址等概念,并通过具体的计算过程,解释了addq、subq、imulq、incq、decq等指令的执行...

    20120724_RTSP录像的几种方式1

    ffmpeg -f video4linux2 -r 30 -i /dev/video0 -vcodec libx264 -subq 5 -g 250 -qmin 10 -qmax 51 -i_qfactor 0.71 -f rtp rtp://172.16.1.100:20000 > 1.sdp 这个命令将摄像头数据源采集到/dev/video0,采样率为 ...

    HIT-2024-ICS大作业

    subq $16, %rsp movl $.LC0, %edi call printf xorl %eax, %eax leave .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size _main, .-_main .Letext0: .LC0: .string "Hello World!\n" ``` 通过上述汇编...

    CASIO fx-5800P编程计算器公路与铁路施工测量程序

    例如,程序SUBQ2-71至SUBQ2-76被用于基于串列输入数据的坐标反算边长与方位计算,而SUBQ2-81至SUBQ2-87等程序则用于线元法任意路线与道曲线坐标正反算程序和放样参数的计算。 书中还提到了程序功能说明,例如QH3-3H...

Global site tag (gtag.js) - Google Analytics