在一台ORACLE服务器上做巡检时,使用下面SQL找出DISK_READ最高的TOP SQL分析时,分析过程中,有一条SQL语句的一些反常现象,让人觉得很奇怪:

SELECT SQL_ID,

       SQL_TEXT, 

       DISK_READS, 

       BUFFER_GETS, 

       PARSING_SCHEMA_NAME, 

       EXECUTIONS 

FROM   V$SQLAREA 

ORDER  BY DISK_READS DESC; 

在SQL Developer中查看SQL的预估执行计划,发现执行计划走INDEX UNIQUE SCAN,而且IO COST其实不高。如下所示,而且执行次数也不是非常多,那么推断:很有可能这个SQL的实际执行计划跟预估的执行计划有很大偏差。

SELECT 

 "Extent1"."SC_NO" AS "SC_NO", 

 "Extent1"."CUSTOMER_CD" AS "CUSTOMER_CD", 

 "Extent1"."FACTORY_CD" AS "FACTORY_CD", 

 "Extent1"."REQ_USER_ID" AS "REQ_USER_ID", 

 "Extent1"."REQ_USER_GRP_ID" AS "REQ_USER_GRP_ID"

 FROM "SC_HD" "Extent1"

 WHERE ("Extent1"."SC_NO" = :p__linq__0) AND (ROWNUM <= (1) )

于是根据SQL_ID生成了对应SQL的awrsqrpt报表,如下截图所示,实际执行计划确实是全表扫描,Buffer Gets与Disk Reads也很高

在sqltrpt.sql里面分析查看该SQL时,如下所示, 可以发现其绑定变量存在隐式转换(implicit data type conversion),导致执行计划走全表扫描

于是分析了一下绑定变量的类型,发现:P__LINQ__0的类型为NVARCHAR(32) 而实际上字段SC_NO为VARCHAR(16),所以肯定是应用程序里面给该绑定变量赋值出现了问题。

SQL> COL NAME FOR A32;

SQL> COL DATATYPE_STRING FOR A20;

SQL> COL VALUE_STRING FOR A20;

SQL>  SELECT NAME, DATATYPE_STRING, VALUE_STRING

  2   FROM v$sql_bind_capture 

  3   WHERE SQL_ID='&SQL_ID' ;

Enter value for sql_id: dhg6qnxv9c4nz

old   3:  WHERE SQL_ID='&SQL_ID'

new   3:  WHERE SQL_ID='dhg6qnxv9c4nz'

 

NAME                             DATATYPE_STRING      VALUE_STRING

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

:P__LINQ__0                      NARCHAR2(32)         GS17K16005

 

SQL> 

后面开发人员协助检查发现,因为这个SQL是代码中Lambda表达式自动生成,后面在Property中设置了字段类型以及长度,问题解决。

//表SC_HD

modelBuilder.Entity<SC_HD>().ToTable("SC_HD", OracleSchema);

modelBuilder.Entity<SC_HD>().HasKey(x => x.SC_NO);

ORACLE实际执行计划与预估执行计划不一致性能优化案例的更多相关文章

  1. 盘点 Oracle 11g 中新特性带来的10大性能影响

    Oracle的任何一个新版本,总是会带来大量引人瞩目的新特性,但是往往在这些新特性引入之初,首先引起的是一些麻烦,因为对于新技术的不了解.因为对于旧环境的不适应,从Oracle产品到技术服务运维,总是 ...

  2. [z]Oracle性能优化-读懂执行计划

    http://blog.csdn.net/lifetragedy/article/details/51320192 Oracle的执行计划   得到执行计划的方式       Autotrace例子 ...

  3. Oracle性能优化-读懂执行计划

    Oracle的执行计划 得到执行计划的方式 Autotrace例子 使用Explain explain plan set STATEMENT_ID='testplan' for select * fr ...

  4. Oracle性能优化之Oracle里的执行计划

    一.执行计划 执行计划是目标SQL在oracle数据库中具体的执行步骤,oracle用来执行目标SQL语句的具体执行步骤的组合被称为执行计划. 二.如何查看oracle数据库的执行计划 oracle数 ...

  5. (转) Oracle性能优化-读懂执行计划

    Oracle的执行计划 得到执行计划的方式 Autotrace例子 使用Explain explain plan set STATEMENT_ID='testplan'for select * fro ...

  6. MySQL— 索引,视图,触发器,函数,存储过程,执行计划,慢日志,分页性能

    一.索引,分页性能,执行计划,慢日志 (1)索引的种类,创建语句,名词补充(最左前缀匹配,覆盖索引,索引合并,局部索引等): import sys # http://www.cnblogs.com/w ...

  7. [20170615]执行dbms_sqldiag.dump_trace看执行计划.txt

    [20170615]执行dbms_sqldiag.dump_trace看执行计划.txt --//上午在想查看10053执行计划时使用包时出现如下提示: SCOTT@book> @ &r ...

  8. ubuntu14.04计划任务无法执行

    在/etc/crontab中添加了任务1,并确认执行时间设置没有错.发现任务没有执行,而/var/log/cron.log日志文件中没有该计划任务的执行信息.另一个计划任务却能正确,通过修改任务1的执 ...

  9. MySQL执行计划显示与执行过程不符合一例

    一 建表和现象的过程如下 CREATE TABLE t1 (id1 INT, a1 INT, b1 INT, PRIMARY KEY(id1));CREATE TABLE t3 (id3 INT UN ...

随机推荐

  1. [python]使用virtualenvWrapper

    什么是virtualenv virtualenv是python的环境管理工具,用于隔离python的运行环境.也就是说,一个项目可以有一个属于这个项目的运行环境,从而避免了因为依赖不同的模块而产生的错 ...

  2. shell 脚本实现文件对称加密

    前言 之前手机里管理密码的脚本,都是直接编写进纯文本然后进行多次归档及压缩来实现不明文存储,一直觉得不太安全,于是昨天晚上编写脚本实现了简单的文件对称加密. 网上文章都利用 openssl 来进行文件 ...

  3. leetcode — trapping-rain-water

    /** * Source : https://oj.leetcode.com/problems/trapping-rain-water/ * * Created by lverpeng on 2017 ...

  4. python练习一—文本转化渲染为html

    想学习python已经很久了,以前使用ArcGIS的时候学习过一些简单的python语法,用来进行一些简单的GIS数据处理,但是后来并没有用到工作中也就荒废了,后来断断续续看过一些,最近想学习一门新的 ...

  5. Win32线程安全问题.同步函数

    线程安全问题.同步函数 一丶简介什么是线程安全 通过上面几讲.我们知道了线程怎么创建.线程切换的原理(CONTEXT结构) 每个线程在切换的时候都有自己的堆栈. 但是这样会有安全问题. 为什么?  我 ...

  6. PHP中的加强型接口Traits

    接口是对多重继承的一种变相实现, Traits可以被视为一种加强型的接口.   先来看如下代码 trait Hello { private $name = 'chenqionghe'; public ...

  7. 解读经典《C#高级编程》第七版 Page45-50.核心C#.Chapter2

    前言 本篇讲述枚举和名称空间. 01 枚举 首先需要明确枚举的概念:枚举是用户定义的整数类型.使用枚举的目标是,使用一组容易记忆的名称,来使得代码更容易编写和维护. 我们对比枚举的定义和类的定义,会发 ...

  8. JavaScript基础知识梳理,你能回答几道题?

    在学习JavaScript的时候,总是这里学一点,那里学一点,很的很零星,很杂,没有很系统的去学习,感觉好像JavaScript的知识点都了解了,但是真正要说起来,又不知道从何说起! 最深刻的体会就是 ...

  9. [转]USDT与omniCore钱包

    本文转自:http://www.cnblogs.com/red-evil/p/10039740.html USDTUSDT,又称为泰达币,是由Tether公司在 2015年推出的一种与美元锚定的加密货 ...

  10. http协议、web服务器、并发服务器(上)

    目录 1. HTTP格式 1.1 HTTP GET请求的格式: 1.2 HTTP POST请求的格式: 1.3 HTTP响应的格式: 2. Web静态服务器-显示固定的页面 3. Web静态服务器-显 ...