在一台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);

最新文章

  1. 利用CSS3中transparent实现三角形及三角形组合图
  2. List&lt;Map&lt;String,Object&gt;&gt;使用Java代码遍历
  3. BZOJ3689 异或之
  4. PHP数组的定义和遍历
  5. less-1
  6. Vim 程序编辑器 经常使用操作
  7. Taum and B&#39;day
  8. (step4.3.9)hdu 1584(蜘蛛牌——DFS)
  9. SQLServer 复制中移除和加入公布而不初始化全部项目
  10. Java继承多态中的方法访问权限控制
  11. struts2.5新配置动态调用
  12. Maven-05:插件目标
  13. docker用法记录
  14. git操作手册
  15. TabBar + TabBarView导航风格
  16. 安装部署Jenkins服务
  17. Mycat配置入门
  18. Spinner功能和用法
  19. iOS活动倒计时的两种实现方式
  20. Spark Standalone与Spark on YARN的几种提交方式

热门文章

  1. Chapter 4 Invitations——1
  2. git在工作中的用法总结-使用篇
  3. Centos-7修改yum源为国内的yum源
  4. 浅谈SpringAOP
  5. Linux comm命令求出文件的交集、差集
  6. DNS域名解析之搭建公司内部域--技术流ken
  7. HBase简介及原理
  8. 【转载】MySql新建账号并分配权限
  9. 结构型---适配器模式(Adapter Pattern)
  10. WPF 列表虚拟化时的滚动方式