博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ORACLE实际执行计划与预估执行计划不一致性能优化案例
阅读量:6790 次
发布时间:2019-06-26

本文共 1633 字,大约阅读时间需要 5 分钟。

 

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

 

 

转载地址:http://lkogo.baihongyu.com/

你可能感兴趣的文章
oracle PL/SQL(procedure language/SQL)程序设计之函数+过程+包(转)
查看>>
B2B门户慧聪网的seo经典案例分析实测
查看>>
如何对List中的对象进行排序
查看>>
如何在Eclipse中添加Tomcat的jar包
查看>>
SQLSERVER 2012之AlwaysOn -- 同步模式下的网卡性能优化
查看>>
MavenInAction
查看>>
ArcGIS Engine开发之旅03--ArcGIS Engine中的控件
查看>>
项目实战--项目介绍
查看>>
西部数据财报抢眼 但东芝谈判案或将影响其NAND供应
查看>>
docker进入容器
查看>>
Shell中反引号(`)与$()用法的区别
查看>>
水仙花数&amp;素数&amp;质因数分解的C语言实现
查看>>
MTD应用学习:mtd和mtdblock的区别
查看>>
如何使用分布是缓存Hazelcast
查看>>
Alluxio源码分析定位策略:循环遍历策略RoundRobinPolicy
查看>>
SaaS与AI,云客服的天平到底应该偏向哪边?
查看>>
Spark-ML-01-小试spark分析离线商品信息
查看>>
10月20日云栖精选夜读:揭秘云栖大会VR直播云服务解决方案的技术亮点和核心能力...
查看>>
DockOne微信分享(一四三):FreeWheel基于Kubernetes容器云构建与实践:应用编排与服务质量保证...
查看>>
【hadoop】 running beyond virtual memory错误原因及解决办法
查看>>