`
bianxq
  • 浏览: 94569 次
  • 性别: 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

分享到:
评论

相关推荐

    实战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_SUBQ**: 将子查询尽可能早地执行。 - **NO_MERGE(v)** 和 **MERGE(v)**: 控制视图是否合并到父查询中。 - **HASH_AJ(v)** 和 **MERGE_AJ(v)**: 控制使用散列反连接或合并反连接处理NOT IN子查询。 - **HASH...

    oralce 维护常用sql语句

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

    cmd-bat-批处理-脚本-98下获取当前路径.zip

    cmd-bat-批处理-脚本-98下获取当前路径.zip

    cmd脚本-bat批处理-去掉字符串不同部位的空格.zip

    cmd脚本-bat批处理-去掉字符串不同部位的空格.zip

    25年上半年湖师大学位报考附件.zip

    25年上半年湖师大学位报考附件.zip

    cmd-bat-批处理-脚本-清空指定大小的文件夹.zip

    cmd-bat-批处理-脚本-清空指定大小的文件夹.zip

    基于MATLAB实现的六种图像增强技术代码总结

    这是一份关于基础图像增强代码的整理,共包含六种常见的图像增强方法,分别是三种Retinex图像增强方法、灰度拉伸、直方图均衡化以及自适应直方图均衡化。这些代码经过验证,均可正常运行,能够帮助用户节省寻找相关代码的时间,从而更专注于自身的实验 。

    cmd-bat-批处理-脚本-局域网扫描.zip

    cmd-bat-批处理-脚本-局域网扫描.zip

    深度学习技术驱动的口罩佩戴情况检测

    首先,利用已有的人脸检测算法对图像进行人脸检测。检测完成后,将检测到的每个人脸单独切割出来,并进行是否戴口罩的二分类判断。在进行分类之前,需要对图像中的人脸进行标注,标注内容包括戴口罩和不戴口罩两种情况。对于标注好的人脸图片,佩戴口罩的人脸图片命名为mask_1,未佩戴口罩的人脸图片命名为nomask_1。当数据集准备完毕后,可以使用train.py文件进行训练。关于训练效果及详细解读,可以参考哔哩哔哩上的视频,视频链接为:基于深度学习的口罩佩戴检测。

    【数据库管理】MySQL元数据查询与管理:数据库结构、表信息及服务器状态获取方法详解

    内容概要:本文主要介绍了MySQL元数据的概念及其获取方式。MySQL元数据是关于数据库和其对象(如表、列、索引等)的信息,存储在系统表中,这些表位于information_schema数据库中。文章详细列举了多种常用的MySQL元数据查询命令,如查看所有数据库(SHOW DATABASES)、选择数据库(USE database_name)、查看数据库中的所有表(SHOW TABLES)、查看表的结构(DESC table_name)、查看表的索引(SHOW INDEX FROM table_name)、查看表的创建语句(SHOW CREATE TABLE table_name)、查看表的行数(SELECT COUNT(*) FROM table_name)、查看列的信息以及查看外键信息等。此外,还介绍了information_schema数据库中的多个表,包括SCHEMATA表、TABLES表、COLUMNS表、STATISTICS表、KEY_COLUMN_USAGE表和REFERENTIAL_CONSTRAINTS表,这些表提供了丰富的元数据信息,可用于查询数据库结构、表信息、列信息、索引信息等。最后,文章还给出了获取查询语句影响的记录数的Perl和PHP实例,以及获取数据库和数据表列表的方法。 适合人群:对MySQL数据库有一定了解,想要深入学习MySQL元数据获取和使用的数据库管理员或开发人员。 使用场景及目标:①帮助用户掌握MySQL元数据的获取方法,以便更好地管理和维护数据库;②通过查询information_schema数据库中的系统表,深入了解数据库结构、表信息、列信息、索引信息等;③提供Perl和PHP实例,方便用户在不同编程环境中获取查询语句影响的记录数和数据库及数据表列表。 其他说明:在使用上述SQL语句时,请注意将查询中的'your_database_name'和'your_table_name'替换为实际的数据库名和表名。此外,在获取数据库和数据表列表时,如果没有足够的权限,结果将返回null。

    cmd-bat-批处理-脚本-实现延时不完全总结.zip

    cmd-bat-批处理-脚本-实现延时不完全总结.zip

    基于经验模态分解(EMD)的信号去噪MATLAB代码实现

    经验模态分解(Empirical Mode Decomposition,EMD)是一种基于数据的信号处理技术,由Nigel Robert Hocking在1998年提出,主要用于分析非线性、非平稳信号。它能够将复杂的信号自适应地分解为若干个本征模态函数(Intrinsic Mode Function,IMF),每个IMF代表信号中不同的频率成分和动态特征。在MATLAB环境下实现EMD去噪,通常包括以下步骤: 信号预处理:对原始信号进行预处理,例如平滑处理或去除异常值,以提高后续分解的准确性。 EMD分解:利用EMD算法对预处理后的信号进行分解,将其拆分为多个IMF和一个残余项。每个IMF对应信号的一个内在频率成分,而残余项通常包含低频或直流成分。 希尔伯特变换:对每个IMF进行希尔伯特变换,计算其瞬时幅度和相位,形成希尔伯特谱,从而更直观地分析信号的时频特性。 去噪策略:常见的去噪策略有两种。一种是根据IMF的频率特性,选择保留低频或高频部分,去除噪声;另一种是利用IMF的Hurst指数,噪声IMF的Hurst指数通常较低,因此可以去除Hurst指数低于阈值的IMF。 重构信号:根据保留的IMF和残余项,通过逆希尔伯特变换和累加,重构出去噪后的信号。 Hurst分析:Hurst指数是评估时间序列长期依赖性的指标,用于区分随机性和自相似性。在EMD去噪中,Hurst分析有助于识别噪声IMF,从而提升去噪效果。 在提供的压缩包中,“license.txt”可能是软件的许可协议文件,用户需遵循其条款使用代码。“EMD-DFA”可能是包含EMD去噪和去趋势波动分析(Detrended Fluctuation Analysis,DFA)的MATLAB代码。DFA是一种用于计算信号长期自相关的统计方法,常与EMD结合,进一步分析信号的分形特征,帮助识别噪声并优化去噪效果。该MATLA

    Python的蚁群优化算法实现与多维函数优化示例

    通过Python实现一个改进型ACO算法,并探讨其在多维函数优化中的应用,为工程优化问题提供新的解决思路。

    cmd-bat-批处理-脚本-枚举显示.zip

    cmd-bat-批处理-脚本-枚举显示.zip

    python实现爬取网络图片爬虫

    python实现爬取网络图片爬虫,亲测可用

    Python实现随机森林算法及配套数据集

    本文件包含随机森林算法的代码实现、对应的数据集以及详细的中文注释,且代码已经经过调试并能正常运行。文件中有两份代码:一份是从网上下载的,另一份是经过自己整理并重新编写的。编程环境是Python 2.7。由于主要目的是用于学习随机森林算法,所以在参数调整方面没有花费太多精力,因此模型的正确率可能并不高。当然,数据集规模较小也是影响正确率的一个因素。如果有兴趣的同学可以自行调整参数,以提高模型的准确率。

    DXCG分析与原理04

    DXCG分析与原理04

    1743390592614.osm

    1743390592614.osm

Global site tag (gtag.js) - Google Analytics