跑批时间段22:00-23:00,生成AWR报告

分析sql:SQL_ID='5hfw4smzs2pqw'

执行计划:

SQL> select *  FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('5hfw4smzs2pqw',NULL,'ALL'));

SQL_ID  5hfw4smzs2pqw, child number 0

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

SELECT a.SEQ_NO,a.ACCTNO,a.POST_TXN_CD,b.POST_METHOD_CD,b.AMT_TYPE,a.BIL

L_AMT,a.POST_DATE,a.EXPLAIN FROM T_EMPLOYY_A a INNER JOIN

T_EMPLOYY_B b ON a.POST_TXN_CD=b.POST_TXN_CD AND a.POST_DATE=:1  AND

a.ACCTNO=:2  AND POST_STATUS_CD=''

Plan hash value: 3635671702                  

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

| Id  | Operation                    | Name              | Rows  | Bytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT             |                   |       |       |  5248 (100)|          |

|   1 |  NESTED LOOPS                |                   |     1 |    71 |  5248   (1)| 00:00:01 |

|   2 |   NESTED LOOPS               |                   |     1 |    71 |  5248   (1)| 00:00:01 |

|*  3 |    TABLE ACCESS FULL         | T_EMPLOYY_A    |     1 |    61 |  5247   (1)| 00:00:01 |

|*  4 |    INDEX UNIQUE SCAN         | PK_T_EMPLOYY_B |     1 |       |     0   (0)|          |

|   5 |   TABLE ACCESS BY INDEX ROWID| T_EMPLOYY_B    |     1 |    10 |     1   (0)| 00:00:01 |

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

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

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

   1 - SEL$58A6D7F6

   3 - SEL$58A6D7F6 / A@SEL$1

   4 - SEL$58A6D7F6 / B@SEL$1

   5 - SEL$58A6D7F6 / B@SEL$1

Predicate Information (identified by operation id):

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

   3 - filter(("A"."ACCTNO"=:2 AND "A"."POST_DATE"=:1 AND "POST_STATUS_CD"=''))

   4 - access("A"."POST_TXN_CD"="B"."POST_TXN_CD")

Column Projection Information (identified by operation id):

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

   1 - "A"."SEQ_NO"[NUMBER,22], "A"."ACCTNO"[VARCHAR2,40], "A"."POST_DATE"[CHARACTER,8],

       "A"."POST_TXN_CD"[NUMBER,22], "A"."BILL_AMT"[NUMBER,22], "A"."EXPLAIN"[VARCHAR2,200],

       "B"."POST_METHOD_CD"[NUMBER,22], "B"."AMT_TYPE"[CHARACTER,2]

   2 - "A"."SEQ_NO"[NUMBER,22], "A"."ACCTNO"[VARCHAR2,40], "A"."POST_DATE"[CHARACTER,8],

       "A"."POST_TXN_CD"[NUMBER,22], "A"."BILL_AMT"[NUMBER,22], "A"."EXPLAIN"[VARCHAR2,200],

       "B".ROWID[ROWID,10]

   3 - "A"."SEQ_NO"[NUMBER,22], "A"."ACCTNO"[VARCHAR2,40], "A"."POST_DATE"[CHARACTER,8],

       "A"."POST_TXN_CD"[NUMBER,22], "A"."BILL_AMT"[NUMBER,22], "A"."EXPLAIN"[VARCHAR2,200]

   4 - "B".ROWID[ROWID,10]

   5 - "B"."POST_METHOD_CD"[NUMBER,22], "B"."AMT_TYPE"[CHARACTER,2]

Note

-----

   - this is an adaptive plan

执行计划

分析:

执行计划:3-->2-->4-->5-->1-->0

第一层循环:根据POST_DATE=:1,ACCTNO=:2,POST_STATUS_CD='0'嵌套循环,全表扫描驱动表T_EMPLOYY_A;

第二层循环:根据a.POST_TXN_CD=b.POST_TXN_CD,嵌套循环,根据索引PK_T_EMPLOYY_B,得到rowid,访问表T_EMPLOYY_B

索引信息:

SQL> select TABLE_NAME,INDEX_NAME,COLUMN_NAME from dba_ind_columns where TABLE_NAME='T_EMPLOYY_A';

TABLE_NAME           INDEX_NAME           COLUMN_NAME

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

T_EMPLOYY_A       PK_T_EMPLOYY_A    SEQ_NO

SQL> select TABLE_NAME,INDEX_NAME,COLUMN_NAME from dba_ind_columns where TABLE_NAME='T_EMPLOYY_B';

TABLE_NAME           INDEX_NAME           COLUMN_NAME

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

T_EMPLOYY_B       PK_T_EMPLOYY_B    POST_TXN_CD

表T_EMPLOYY_A条件列、连接条件字段没有索引

表的总行数

SQL> select count(*) from SCOTT.T_EMPLOYY_A;

COUNT(*)

----------

2029447

SQL> select count(*) from SCOTT.T_EMPLOYY_B;

COUNT(*)

----------

52

连接列的匹配情况:

SQL> select count(distinct(POST_TXN_CD)) from SCOTT.T_EMPLOYY_A;

COUNT(DISTINCT(POST_TXN_CD))

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

26

SQL> select count(distinct(POST_TXN_CD)) from SCOTT.T_EMPLOYY_B;

COUNT(DISTINCT(POST_TXN_CD))

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

52

ACCTNO列在T_EMPLOYY_A表的筛选性

SQL>  select count(distinct(ACCTNO)) from SCOTT.T_EMPLOYY_A;

COUNT(DISTINCT(ACCTNO))

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

225427

POST_DATE列在T_EMPLOYY_A表的筛选性

SQL> select count(distinct(POST_DATE)) from SCOTT.T_EMPLOYY_A;

COUNT(DISTINCT(POST_DATE))

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

736

SQL> select count(*) from ( select distinct ACCTNO,POST_DATE from  SCOTT.T_EMPLOYY_A);

COUNT(*)

----------

1690282

优化建议:1:在表T_EMPLOYY_A的ACCTNO, POST_DATE列创建联合索引

2:利用hind,修改驱动表为T_EMPLOYY_B.但是需要修改SQL语句,需上线调整,所以不使用。

ACCTNO筛选性强,放在联合索引列的前面

创建联合索引

SQL> create index IDX_ACCTNO_POST_DATE on SCOTT.T_EMPLOYY_A (ACCTNO, POST_DATE)   tablespace SCOTT_IDX01

SQL> select *  FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('5hfw4smzs2pqw',NULL,'ALL'));

SQL_ID  5hfw4smzs2pqw, child number 0

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

SELECT a.SEQ_NO,a.ACCTNO,a.POST_TXN_CD,b.POST_METHOD_CD,b.AMT_TYPE,a.BIL

L_AMT,a.POST_DATE,a.EXPLAIN FROM T_EMPLOYY_A a INNER JOIN

T_EMPLOYY_B b ON a.POST_TXN_CD=b.POST_TXN_CD AND a.POST_DATE=:1  AND

a.ACCTNO=:2  AND POST_STATUS_CD=''

Plan hash value: 1730680787

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

| Id  | Operation                             | Name                 | Rows  | Bytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT                      |                      |       |       |     5 (100)|          |

|   1 |  NESTED LOOPS                         |                      |     1 |    71 |     5   (0)| 00:00:01 |

|   2 |   NESTED LOOPS                        |                      |     1 |    71 |     5   (0)| 00:00:01 |

|*  3 |    TABLE ACCESS BY INDEX ROWID BATCHED| T_EMPLOYY_A       |     1 |    61 |     4   (0)| 00:00:01 |

|*  4 |     INDEX RANGE SCAN                  | IDX_ACCTNO_POST_DATE |     1 |       |     3   (0)| 00:00:01 |

|*  5 |    INDEX UNIQUE SCAN                  | PK_T_EMPLOYY_B    |     1 |       |     0   (0)|          |

|   6 |   TABLE ACCESS BY INDEX ROWID         | T_EMPLOYY_B       |     1 |    10 |     1   (0)| 00:00:01 |

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

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

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

    1 - SEL$58A6D7F6

   3 - SEL$58A6D7F6 / A@SEL$1

   4 - SEL$58A6D7F6 / A@SEL$1

   5 - SEL$58A6D7F6 / B@SEL$1

   6 - SEL$58A6D7F6 / B@SEL$1

Predicate Information (identified by operation id):

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

   3 - filter("POST_STATUS_CD"='')

   4 - access("A"."ACCTNO"=:2 AND "A"."POST_DATE"=:1)

   5 - access("A"."POST_TXN_CD"="B"."POST_TXN_CD")

Column Projection Information (identified by operation id):

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

   1 - "A"."SEQ_NO"[NUMBER,22], "A"."ACCTNO"[VARCHAR2,40], "A"."POST_DATE"[CHARACTER,8],

       "A"."POST_TXN_CD"[NUMBER,22], "A"."BILL_AMT"[NUMBER,22], "A"."EXPLAIN"[VARCHAR2,200],

       "B"."POST_METHOD_CD"[NUMBER,22], "B"."AMT_TYPE"[CHARACTER,2]

   2 - "A"."SEQ_NO"[NUMBER,22], "A"."ACCTNO"[VARCHAR2,40], "A"."POST_DATE"[CHARACTER,8],

       "A"."POST_TXN_CD"[NUMBER,22], "A"."BILL_AMT"[NUMBER,22], "A"."EXPLAIN"[VARCHAR2,200],

       "B".ROWID[ROWID,10]

   3 - "A"."SEQ_NO"[NUMBER,22], "A"."ACCTNO"[VARCHAR2,40], "A"."POST_DATE"[CHARACTER,8],

       "A"."POST_TXN_CD"[NUMBER,22], "A"."BILL_AMT"[NUMBER,22], "A"."EXPLAIN"[VARCHAR2,200]

   4 - "A".ROWID[ROWID,10], "A"."ACCTNO"[VARCHAR2,40], "A"."POST_DATE"[CHARACTER,8]

   5 - "B".ROWID[ROWID,10]

   6 - "B"."POST_METHOD_CD"[NUMBER,22], "B"."AMT_TYPE"[CHARACTER,2]

Note

-----

   - this is an adaptive plan

优化后的执行计划

两天跑批时间段22:00-23:00的性能对比

经优化后,数据库逻辑读下降,CPU负载下降

20180808逻辑读:

20180809逻辑读:

SQL优化—nested loop优化的更多相关文章

  1. SQL Server nested loop join 效率试验

    从很多网页上都看到,SQL Server有三种Join的算法, nested loop join, merge join, hash join. 其中最常用的就是nested loop join. 在 ...

  2. oracle 表连接 - nested loop 嵌套循环连接

    一. nested loop 原理 nested loop 连接(循环嵌套连接)指的是两个表连接时, 通过两层嵌套循环来进行依次的匹配, 最后得到返回结果集的表连接方法. 假如下面的 sql 语句中表 ...

  3. Sql优化(一) Merge Join vs. Hash Join vs. Nested Loop

    原创文章,首发自本人个人博客站点,转载请务必注明出自http://www.jasongj.com Nested Loop,Hash Join,Merge Join介绍 Nested Loop: 对于被 ...

  4. 1122MySQL性能优化之 Nested Loop Join和Block Nested-Loop Join(BNL)

    转自http://blog.itpub.net/22664653/viewspace-1692317/ 一 介绍  相信许多开发/DBA在使用MySQL的过程中,对于MySQL处理多表关联的方式或者说 ...

  5. 如何在不改SQL的情况下优化数据库

    主题简介 在数据库运维中我们会遇到各种各样的问题,这些问题的根源可能很明显,也可能被某种表象掩盖而使我们认不清.所以运维面临的两大问题就是,第一我们没有看清本质,第二应用不允许修改.那么我们如何解决这 ...

  6. 【转】使用SQL Tuning Advisor STA优化SQL

    SQL优化器(SQL Tuning Advisor STA)是Oracle10g中推出的帮助DBA优化工具,它的特点是简单.智能,DBA值需要调用函数就可以给出一个性能很差的语句的优化结果.下面介绍一 ...

  7. 【转】MySQL批量SQL插入各种性能优化

    原文:http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=403182899&idx=1&sn=74edf28b0bd29 ...

  8. SQL Server数据库性能优化之SQL语句篇【转】

    SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一 ...

  9. SQL SERVER 查询性能优化——分析事务与锁(五)

    SQL SERVER 查询性能优化——分析事务与锁(一) SQL SERVER 查询性能优化——分析事务与锁(二) SQL SERVER 查询性能优化——分析事务与锁(三) 上接SQL SERVER ...

随机推荐

  1. 《剑指offer》面试题24 二叉搜索树的后序遍历序列 Java版

    (判断一个元素均不相同的序列是否为一个BST的LRD) 书中方法:首先对于二叉搜索树,左子树中的所有元素小于根节点小于右子树中的所有元素,然后后序遍历序列最后一个元素是根节点,这是我们已知的条件.这道 ...

  2. c++多线程并发学习笔记(1)

    共享数据带来的问题:条件竞争 避免恶性条件竞争的方法: 1. 对数据结构采用某种保护机制,确保只有进行修改的线程才能看到修改时的中间状态.从其他访问线程的角度来看,修改不是已经完成了,就是还没开始. ...

  3. 网络 osi七层协议

    一 互联网的本质 咱们先不说互联网是如何通信的(发送数据,文件等),先用一个经典的例子,给大家说明什么是互联网通信. 现在追溯到八九十年代,当时电话刚刚兴起,还没有手机的概念,只是有线电话,那么此时你 ...

  4. 小白学Python——Matplotlib 学习(1)

    众所周知,通过数据绘图,我们可以将枯燥的数字转换成容易被人们接受的图表,从而让人留下更加深刻的印象.而大多数编程语言都有自己的绘图工具,matplotlib就是基于Python的绘图工具包,使用它我们 ...

  5. HNUSTOJ-1695 跳格子(略感头疼)

    1695: 跳格子 时间限制: 1 Sec  内存限制: 128 MB提交: 230  解决: 57[提交][状态][讨论版] 题目描述 逸夫楼的大厅的地面有10行10列的石砖,我们用坐标(x,y)来 ...

  6. TMS320F28335——下载程序到flash中

    一.让CCS软件支持Flash烧写 添加F28335.cmd文件 如图屏蔽掉25335_RAM_lnk.cmd 2.支持从Flash中拷贝文件到RAM中 添加DSP2832x_MemCopy.c 在主 ...

  7. luogu P1397 [NOI2013]矩阵游戏

    传送门 题目中那两个递推式显然可以写成矩乘的形式,然后十进制快速幂即可.这里不再赘述 只有两个递推式,我们可以考虑一波推式子,首先第一行的元素应该分别是\(1,a+b,a^2+ab+b,a^3+a^2 ...

  8. AtCoder Regular Contest 092 2D Plane 2N Points AtCoder - 3942 (匈牙利算法)

    Problem Statement On a two-dimensional plane, there are N red points and N blue points. The coordina ...

  9. Manacher || Luogu P3805【模板】manacher算法

    题面:[模板]manacher算法 代码: #include<cstdio> #include<cstring> #include<iostream> #defin ...

  10. 九、ARM 汇编与 C 的混合编程

    9.1 ARM 汇编与 C 的混合编程 9.1.1 内嵌汇编 __asm __asm("指令")例如关闭/打开总中断开关 CPSR __asm //使用 C 中变量名代替寄存器 { ...