优化前:表连接使用merge

SQL> alter session set statistics_level=all;

Session altered.

SQL> select e.sal,d.dname from (select deptno,sum(sal) sal from emp group by deptno) e,dept d where d.deptno=e.deptno;

       SAL DNAME
---------- --------------
8750 ACCOUNTING
10875 RESEARCH
9400 SALES SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats +alias +outline')); PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID g2kzsydh3kmmq, child number 0
-------------------------------------
select e.sal,d.dname from (select deptno,sum(sal) sal from emp group by deptno) e,dept d where d.deptno=e.deptno Plan hash value: 2992795152 -----------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | O/1/M |
-----------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | | 6 |00:00:00.01 | 20 | | | |
| 1 | MERGE JOIN | | 2 | 3 | 6 |00:00:00.01 | 20 | | | |
| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 2 | 4 | 8 |00:00:00.01 | 8 | | | |
| 3 | INDEX FULL SCAN | PK_DEPT | 2 | 4 | 8 |00:00:00.01 | 4 | | | |
|* 4 | SORT JOIN | | 8 | 3 | 6 |00:00:00.01 | 12 | 2048 | 2048 | 2/0/0|
| 5 | VIEW | | 2 | 3 | 6 |00:00:00.01 | 12 | | | |
| 6 | HASH GROUP BY | | 2 | 3 | 6 |00:00:00.01 | 12 | 1214K| 1214K| 2/0/0|
| 7 | TABLE ACCESS FULL | EMP | 2 | 14 | 28 |00:00:00.01 | 12 | | | |
----------------------------------------------------------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id):
------------------------------------------------------------- 1 - SEL$1
2 - SEL$1 / D@SEL$1
3 - SEL$1 / D@SEL$1
5 - SEL$2 / E@SEL$1
6 - SEL$2
7 - SEL$2 / EMP@SEL$2 Outline Data
------------- /*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
DB_VERSION('11.2.0.4')
ALL_ROWS
OUTLINE_LEAF(@"SEL$2")
OUTLINE_LEAF(@"SEL$1")
INDEX(@"SEL$1" "D"@"SEL$1" ("DEPT"."DEPTNO"))
NO_ACCESS(@"SEL$1" "E"@"SEL$1")
LEADING(@"SEL$1" "D"@"SEL$1" "E"@"SEL$1")
USE_MERGE(@"SEL$1" "E"@"SEL$1")
FULL(@"SEL$2" "EMP"@"SEL$2")
USE_HASH_AGGREGATION(@"SEL$2")
END_OUTLINE_DATA
*/ Predicate Information (identified by operation id):
--------------------------------------------------- 4 - access("D"."DEPTNO"="E"."DEPTNO")
filter("D"."DEPTNO"="E"."DEPTNO") 56 rows selected. SQL>

将上面的执行计划中的merge改为hash连接,使用hint再次执行:

SQL> select   /*+
2 BEGIN_OUTLINE_DATA
3 IGNORE_OPTIM_EMBEDDED_HINTS
4 OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
5 DB_VERSION('11.2.0.4')
6 ALL_ROWS
7 OUTLINE_LEAF(@"SEL$2")
8 OUTLINE_LEAF(@"SEL$1")
9 INDEX(@"SEL$1" "D"@"SEL$1" ("DEPT"."DEPTNO"))
10 NO_ACCESS(@"SEL$1" "E"@"SEL$1")
11 LEADING(@"SEL$1" "D"@"SEL$1" "E"@"SEL$1")
12 USE_HASH(@"SEL$1" "E"@"SEL$1")
13 FULL(@"SEL$2" "EMP"@"SEL$2")
14 USE_HASH_AGGREGATION(@"SEL$2")
15 END_OUTLINE_DATA
16 */ e.sal,d.dname from (select deptno,sum(sal) sal from emp group by deptno) e,dept d where d.deptno=e.deptno; SAL DNAME
---------- --------------
9400 SALES
10875 RESEARCH
8750 ACCOUNTING SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats +alias +outline')); PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID 5sns096pbcwj8, child number 0
-------------------------------------
select /*+ BEGIN_OUTLINE_DATA IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
DB_VERSION('11.2.0.4') ALL_ROWS OUTLINE_LEAF(@"SEL$2")
OUTLINE_LEAF(@"SEL$1") INDEX(@"SEL$1" "D"@"SEL$1"
("DEPT"."DEPTNO")) NO_ACCESS(@"SEL$1" "E"@"SEL$1")
LEADING(@"SEL$1" "D"@"SEL$1" "E"@"SEL$1") USE_HASH(@"SEL$1"
"E"@"SEL$1") FULL(@"SEL$2" "EMP"@"SEL$2")
USE_HASH_AGGREGATION(@"SEL$2") END_OUTLINE_DATA */
e.sal,d.dname from (select deptno,sum(sal) sal from emp group by
deptno) e,dept d where d.deptno=e.deptno Plan hash value: 208030399 -----------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | O/1/M |
-----------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 3 |00:00:00.01 | 8 | | | |
|* 1 | HASH JOIN | | 1 | 3 | 3 |00:00:00.01 | 8 | 1599K| 1599K| 1/0/0|
| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 4 | 4 |00:00:00.01 | 2 | | | |
| 3 | INDEX FULL SCAN | PK_DEPT | 1 | 4 | 4 |00:00:00.01 | 1 | | | |
| 4 | VIEW | | 1 | 3 | 3 |00:00:00.01 | 6 | | | |
| 5 | HASH GROUP BY | | 1 | 3 | 3 |00:00:00.01 | 6 | 1214K| 1214K| 1/0/0|
| 6 | TABLE ACCESS FULL | EMP | 1 | 14 | 14 |00:00:00.01 | 6 | | | |
----------------------------------------------------------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id):
------------------------------------------------------------- 1 - SEL$1
2 - SEL$1 / D@SEL$1
3 - SEL$1 / D@SEL$1
4 - SEL$2 / E@SEL$1
5 - SEL$2
6 - SEL$2 / EMP@SEL$2 Outline Data
------------- /*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('11.2.0.4')
DB_VERSION('11.2.0.4')
ALL_ROWS
OUTLINE_LEAF(@"SEL$2")
OUTLINE_LEAF(@"SEL$1")
INDEX(@"SEL$1" "D"@"SEL$1" ("DEPT"."DEPTNO"))
NO_ACCESS(@"SEL$1" "E"@"SEL$1")
LEADING(@"SEL$1" "D"@"SEL$1" "E"@"SEL$1")
USE_HASH(@"SEL$1" "E"@"SEL$1")
FULL(@"SEL$2" "EMP"@"SEL$2")
USE_HASH_AGGREGATION(@"SEL$2")
END_OUTLINE_DATA
*/ Predicate Information (identified by operation id):
--------------------------------------------------- 1 - access("D"."DEPTNO"="E"."DEPTNO") 62 rows selected. SQL>

针对该sql,在创建新的profile。

根据执行计划优化sql语句的更多相关文章

  1. ORACLE 查看有多个执行计划的SQL语句

    在SQL优化过程,有时候需要查看哪些SQL具有多个执行计划(Multiple Executions Plans for the same SQL statement),因为同一个SQL有多个执行计划一 ...

  2. 利用pl/sql执行计划评估SQL语句的性能简析

    一段SQL代码写好以后,可以通过查看SQL的执行计划,初步预测该SQL在运行时的性能好坏,尤其是在发现某个SQL语句的效率较差时,我们可以通过查看执行计划,分析出该SQL代码的问题所在.  那么,作为 ...

  3. Postgresql_根据执行计划优化SQL

    执行计划路径选择 postgresql查询规划过程中,查询请求的不同执行方案是通过建立不同的路径来表达的,在生成许多符合条件的路径之后,要从中选择出代价最小的路径,把它转化为一个计划,传递给执行器执行 ...

  4. 使用plsql执行计划进行sql调优(转载)

    一段SQL代码写好以后,可以通过查看SQL的执行计划,初步预测该SQL在运行时的性能好坏,尤其是在发现某个SQL语句的效率较差时,我们可以通过查看执行计划,分析出该SQL代码的问题所在. 那么,作为开 ...

  5. 应用索引技术优化SQL 语句(转)

    原文出处 一.前言 很多数据库系统性能不理想是因为系统没有经过整体优化,存在大量性能低下的SQL 语句.这类SQL语句性能不好的首要原因是缺乏高效的索引.没有索引除了导致语句本身运行速度慢外,更是导致 ...

  6. 使用V$SQL_PLAN视图获取曾经执行过的SQL语句执行计划

    通常我们查看SQL语句的执行计划都是通过EXPLAIN PLAN或者AUTOTRACE来完成.但是这些查看方法有一个限制,它们都是人为触发而产生的,无法获得数据库系统中曾经执行过的SQL语句执行计划. ...

  7. mysql优化SQL语句的一般步骤及常用方法

    一.优化SQL语句的一般步骤 1. 通过show status命令了解各种SQL的执行频率 mysqladmin extended-status 或: show [session|global]sta ...

  8. 在优化SQL语句中使用虚拟索引

    定义:虚拟索引(virtual index) 是指没有创建对应的物理段的索引. 虚拟索引的目的:是在不损耗主机CPU,IO,磁盘空间去实际创建索引的情况下,来判断一个索引是否能够对SQL优化起到作用. ...

  9. 引用:初探Sql Server 执行计划及Sql查询优化

    原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之————探索MSSQL执行计划 作者:no_mIss 最近总想 ...

随机推荐

  1. 【翻译】Kinect v2程序设计(C++) BodyIndex篇

    通过Kinect SDK v2预览版,取得BodyIndex(人体区域)的方法和示例代码. 上一节,介绍了从Kinect v2预览版用Kinect SDK v2预览版获取Depth数据的方法.   这 ...

  2. Web前端开发:什么是页面重回(repaints)与回流(reflow)

    前言:什么是重绘与回流? 重绘(repaints)是一个元素外观的改变所触发的浏览器行为,例如改变vidibility.outline.背景色等属性.浏览器会根据元素的新属性重新绘制,使元素呈现新的外 ...

  3. BAT批处理(二)

    在前一篇中已对BAT批处理基础作了一些总结,但是对于BAT批处理还有很多的知识点没有讲解到,比如DOS中的特殊符号:IF.FOR的使用:变量:更多的DOS命令等等.本文在前一篇的基础上继续对BAT批处 ...

  4. 在Delphi下,如何使ShowMessage中的按钮中文化

    如果你使用messagedlg(对showmessage也适用)可以汉化定义按钮caption的常量,具体操作步骤如下: 1.   打开文件consts.pas(在Delphi安装目录的/source ...

  5. java RMI

    import java.rmi.*; public interface Hello extends Remote { public String getGreeting() throws Remote ...

  6. App Previews操作经验

    App Previews操作经验 http://www.cocoachina.com/ios/20140924/9741.html http://www.cocoachina.com/bbs/read ...

  7. 面向对象之struct

    struct PointStruct { int pointx = 1; int pointy = 2; public PointStruct(int x, int y) { this.pointx ...

  8. dubbo,gradle,spring build from source

    https://github.com/alibaba/dubbo http://www.csdn.net/article/2012-11-13/2811827-alibaba-Dubbo-Distri ...

  9. js 判断js函数、变量是否存在

    //是否存在指定函数 function isExitsFunction(funcName) { try { if (typeof(eval(funcName)) == "function&q ...

  10. Java回调实现

    一.回调的形式 1. C.C++和Pascal允许将函数指针作为参数传递给其它函数.JavaScript,Python,和PHP允许简单的将函数名作为参数传递. 2. .NET Framework的语 ...