Oracle的SQL优化二

收到开发提交的一条SQL,在高并发下较慢,看能否做一些优化:

该SQL是1个表对另一个表做Left join,首先执行下看看,

SQL> select l.vcno,opttype,add_points,optdate,remark,memid,id,FAMILYID,create_Username,billno,billtype,billsubcase,reduce_Points, l.addnum,addpresentum,reducenum,reducepresentnum

2  from  HQ_07310066.m_mempoint_logs l left join  HQ_07310066.m_memdetail m on l.vcno = m.vcno where 1=1 AND l.memid = ‘WX000000361‘ order by optdate desc;

已选择208行。

执行计划

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

Plan hash value: 2095947206

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

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

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

|   0 | SELECT STATEMENT   |                 |     4 |   464 |   172   (2)| 00:00:03 |

|   1 |  SORT ORDER BY     |                 |     4 |   464 |   172   (2)| 00:00:03 |

|*  2 |   TABLE ACCESS FULL| M_MEMPOINT_LOGS |     4 |   464 |   171   (1)| 00:00:03 |

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

Predicate Information (identified by operation id):

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

2 - filter("L"."MEMID"=‘WX000000361‘)

统计信息

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

0  recursive calls

0  db block gets

626  consistent gets

0  physical reads

0  redo size

7125  bytes sent via SQL*Net to client

663  bytes received via SQL*Net from client

15  SQL*Net roundtrips to/from client

1  sorts (memory)

0  sorts (disk)

208  rows processed

可能是主外键约束的原因,优化器自动对HQ_07310066.m_memdetail做了表消除。所以如果确定两表之间存在严格的主外键约束,可以直接在SQL中把不需要的表去掉,如下:

SQL> select l.vcno,opttype,add_points,optdate,remark,memid,id,FAMILYID,create_Username,billno,billtype,billsubcase,reduce_Points, l.addnum,addpresentum,reducenum,

2  reducepresentnum

3  from  HQ_07310066.m_mempoint_logs l

4  where  l.memid = ‘WX000000361‘

5  order by optdate desc;

已选择208行。

已用时间:  00: 00: 00.02

执行计划

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

Plan hash value: 2095947206

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

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

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

|   0 | SELECT STATEMENT   |                 |     4 |   464 |   172   (2)| 00:00:03 |

|   1 |  SORT ORDER BY     |                 |     4 |   464 |   172   (2)| 00:00:03 |

|*  2 |   TABLE ACCESS FULL| M_MEMPOINT_LOGS |     4 |   464 |   171   (1)| 00:00:03 |

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

Predicate Information (identified by operation id):

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

2 - filter("L"."MEMID"=‘WX000000361‘)

统计信息

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

1  recursive calls

0  db block gets

626  consistent gets

0  physical reads

0  redo size

11245  bytes sent via SQL*Net to client

663  bytes received via SQL*Net from client

15  SQL*Net roundtrips to/from client

1  sorts (memory)

0  sorts (disk)

208  rows processed

再创建索引:create index  HQ_07310066.i_m_mempoint_logs_optdate on  HQ_07310066.m_mempoint_logs(optdate);

SQL> select l.vcno,opttype,add_points,optdate,remark,memid,id,FAMILYID,create_Username,billno,billtype,billsubcase,reduce_Points, l.addnum,addpresentum,reducenum,

2  reducepresentnum

3  from  HQ_07310066.m_mempoint_logs l

4  where  l.memid = ‘WX000000361‘

5  order by optdate desc;

已选择208行。

已用时间:  00: 00: 00.02

执行计划

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

Plan hash value: 3466595853

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

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

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

|   0 | SELECT STATEMENT             |                           |     4 |   464 |     6  (17)| 00:00:01 |

|   1 |  SORT ORDER BY               |                           |     4 |   464 |     6  (17)| 00:00:01 |

|   2 |   TABLE ACCESS BY INDEX ROWID| M_MEMPOINT_LOGS           |     4 |   464 |     5   (0)| 00:00:01 |

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

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

Predicate Information (identified by operation id):

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

3 - access("L"."MEMID"=‘WX000000361‘)

统计信息

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

1  recursive calls

0  db block gets

44  consistent gets

2  physical reads

0  redo size

11245  bytes sent via SQL*Net to client

663  bytes received via SQL*Net from client

15  SQL*Net roundtrips to/from client

1  sorts (memory)

0  sorts (disk)

208  rows processed

优化完成。

时间: 2024-10-12 11:31:10

Oracle的SQL优化二的相关文章

SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一)

SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一) SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间 下面举两个简单的例子: 图书馆的例子:一个图书馆那么多书,怎么管理呢?建立一个字母开头的目录,例如:a开头的书,在第一排,b开头

oracle pl/sql 实战学习 -避免误用

这几天看了下 oracle pl/sql 实战 这本书,出于对sql语句性能的研究,先研究下游标对代码的影响. 1.逐行处理 程序声明了一个游标c1,然后用游标for循环隐式地打开了这个游标,对从游标c1取出的每一行,程序查询customers表,并把first_name和last_name的值填充到变量,随后插入一行数据到top_sales_customers表. 问题1: 代码清单1-1的编程方法很有问题.即使在循环中调用的SQL语句是高度优化的,程序的执行还是会消耗大量时间.假设查询cus

基于oracle的sql优化方法论

Oracle数据库里SQL优化的终极目标就是要缩短目标SQL语句的执行时间.要达到上述目的,我们通常只有如下三种方法可以选择: 1.降低目标SQL语句的资源消耗: 2.并行执行目标SQL语句: 3.平衡系统的资源消耗. "方法1:降低目标SQL语句的资源消耗"以缩短执行时间,这是最常用的SQL优化方法.这种方法的核心是要么通过在不更改业务逻辑的情况下改写SQL来降低目标SQL语句的资源消耗,要么不改SQL但通过调整执行计划或相关表的数据来降低目标SQL语句的资源消耗. 方法2:并行执行

数据库性能优化二:数据库表优化

数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第二部分 数据库性能优化二:数据库表优化 优化①:设计规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询需要.避免数据库操作异常的数据库设计方式.满足范式要求的表,称为规范化表,范式产生于20世纪70年代初,一般表设计满足前三范式就可以,在这里简单介绍一下前三范式 先给大家看一下百度百科给出的定义: 第一范式(1NF)无重复的列 所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域

转://从一条巨慢SQL看基于Oracle的SQL优化

http://mp.weixin.qq.com/s/DkIPwbDKIjH2FMN13GkT4w 本次分享的内容是基于Oracle的SQL优化,以一条巨慢的SQL为例,从快速解读SQL执行计划.如何从执行计划中找到SQL执行慢的Root Cause.统计信息与cardinality问题.探索性能杀手Filter操作.如何进行逻辑重写让SQL起飞等多个维度进行解析,最终优化巨慢SQL语句,希望能够抛砖引玉,和大家一起探讨SQL优化方法. 另外,还简单介绍了两种解决疑难SQL优化问题的工具:1005

Oracle 和SQL server中数据备份与恢复

Oracle 侧 创建一个表,将现有表数据导入其中. create Table  TB_NYU_TENDERTBL_BAK   as  select *  from  TB_NYU_TENDERTBL  where  1=1 删除原来表内容. DELETE  FROM TB_NYU_TENDERTBL 恢复表的内容 insert  into TB_NYU_TENDERTBL  select  * from  TB_NYU_TENDERTBL_BAK SQL server侧 select  * i

Datatypes translation between Oracle and SQL Server

Datatypes translation between Oracle and SQL Server part 1: character, binary strings Datatypes translation is one of the most important things you need to consider when migrate your application from one database to the other. This is an article in t

Oracle 基本SQL SELECT语句

SELECT  *  |    {   [ DISTINCT  ]    column   |    expression   [   alias   ]  ,   ...    } FROM  table; ?SELECT  标识 选择哪些列. ?FROM    标识从哪个表中选择. column后面加上空格,同时跟上别名(alias),或者 as 别名,到下一行的内容时,要用逗号隔开, 默认的别名是小写的,如果想要让它是大写的,使用 "别名" 如果别名有多个单词的时候,用双引号别名

ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE PL/SQL编程之八:把触发器说透 得到了大家的强力支持,感谢.接下来再下猛药,介绍下一篇,大家一定要支持与推荐呀~!我也才有动力写后面的.   本篇主要内容如下: 6.1 引言 6.2 创建函数 6.3 存储过程 6.3.1 创建过程 6.3.2 调用存储过程 6.3.3 AUTHID 6.3.4