一个比较经典的案例,隐式类型转换发生在字段上,会造成索引无法使用的严重性能问题; 隐式类型转换发生在绑定变量上,会造成acs失效的情况,造成的影响比较隐蔽。
https://mp.weixin.qq.com/s/l4-Ni8opRS4DB8i6qEEfpA
数据库突发性能问题,有时可能通过重启应用、重新收集统计信息、重启数据库等方法得到临时解决。
为什么要找到根因:为了避免故障再次发生,为了找到问题的责任方:运维、开发还是数据库产品自身原因(缺陷或是bug),让背锅的一方心服口服。
很多对业务稳定性要求非常高的行业(比如金融、通信、铁路、航空等)的数据库系统,都会购买oracle 售后高服(ACS)中的顶级服务SSC服务。
问题描述
一个时段,重要业务的SQL执行计划发生改变,执行效率严重下降。执行cost变小了,效率下降了几千倍。
根因分析
谓词越界
1、该时段是系统对需要收集统计信息的表,收集统计信息。
2、收集后的一段时间内,会对该表的相关sql做硬解析。
3、硬解析时,会发生绑定变量窥视。如果窥视到的绑定变量,超出了字段上统计信息的最大最小(一般是最大)值范围,就可能发生谓词越界。谓词越界就可能会出现索引选择错误,导致生成低效执行计划。
4、真正的谓词越界一般发生在varchar2和number字段,日期字段虽然经常发生越界,但是系统对于日期类型字段的越界算法,有一定的容忍度,不会认为是真正的越界。这个sql发生越界的字段保存的数据是日期数据,但是使用的却是number类型。这里面涉及到一个重要的开发规范相关内容:非常不建议用number或varchar2类型保存日期数据,规范做法是使用date类型。因为按天查询时,date类型一般需要写两段范围条件,而number或varchar2类型,可以用一个等值条件即可完成,而且不用做to_date转换。这种偷懒的不规范做法,会给SQL性能带来较大的性能隐患。
5、发生谓词越界后,数据库优化器在评估这个sql可以使用的两个索引(都是以越界字段开头的组合索引)时,就不是常规的选择方式,而是选择leaf blocks较少的那一个,这个案例,leaf blocks较少的那个索引,恰好是低效的那一个。
6、sqlhc捕获到了sql后面的一些执行情况,很多使用的绑定变量已经不再越界,而且系统的自适应游标(ACS)保持开启状态,为什么ACS没能及时把执行计划调整回正常? 这里面又涉及到另一个不规范的情况:绑定变量使用的数据类型是char,刚刚我们提到字段使用的类型是number,优化器需要对绑定变量做to_number隐式类型转换,这种转换导致了ACS不生效。
7、不赞成关闭ACS,这个案例,虽然ACS因为绑定变量类型不匹配没有生效,但是如果绑定变量使用的数据类型也是number,那么ACS就会生效,不会出现执行计划一错到底的情况:对于后面谓词不越界的情况,ACS还能及时调整回正常的执行计划。ACS在11g版本引入,开始时bug较多,到了11204版本,很多bug已经修复了,它起到的作用远远高于bug带来的一些小问题。
知识点
SQL语句的查询条件超出了数据库统计信息所记录的范围。谓词越界会导致Oracle优化器错误的选择SQL语句的执行计划,导致性能问题。
谓词越界一般会发生在什么场景下?
- 临时表
这里指的是业务上的临时表而不是Oracle数据库本身的temporary table。在某些系统中会根据业务条件创建前台表和后台表,数据先进入前台表,处理完毕后,存入后台表,并用delete语句清理前台表的数据,前台表起到一个临时表的作用。我们知道,Oracle自动收集统计信息的默认时间窗口是工作日晚上的22点到凌晨2点,或者周末的早上6点到第二天凌晨2点。在自动收集统计信息窗口内,数据库前台表基本上处于无数据,或者数据量很小的情况,那么产生的统计信息就会和白天实际处理业务数据时有偏差,就有可能发生谓词越界的情况。 - 巨大表
Oracle触发自动收集某个表的统计信息的条件是表中修改的数据量超过该表数据总量的10%,假设一个表每天新增1w条数据,一年后这个表变成了365w条数据,那么这意味着这个表需要再过一个多月才会触发一次自动收集统计信息的作业。那么在这个表上的谓词查询,尤其是时间、序列等自增条件上的查询,就可能发生谓词越界的情况,影响优化器正确选择执行计划。
- 什么是Oracle ACS
Oracle ACS 是Oracle Advanced Customer Support (甲骨文高级客户服务)的简称,这项服务由全球拥有数千名经验丰富的高级支持工程师团队来运营,隶属于Oracle Global Support Services全球支持服务业务部门。Oracle除了对于购买软件,应用系统,一体机集成系统的客户提供Premier Support(高级服务,包括MOS网站24小时技术支持,主动支持,最新软件下载, 补丁下载等等),Oracle在此基础上,20多年前即推出ACS服务来满足客户对于关键系统和个性化的需求。随着云计算业务的不断发展,Oracle又推出了Oracle Managed Cloud Servers (Oracle 托管云服务)来满足客户的云计算方面的需求。 - Oracle ACS服务的特点
√连接: 作为Oracle内部服务部门,可以快速地与产品开发及全球支持部门建立沟通,通过指定的的技术客户经理协调资源,与客户实现无缝的连接,这样可以更加有效地满足客户的需要,例如紧急客户支持,24 X 7监控,迁移等等。
√集成: 作为连接的目的,Oracle ACS汇集全球的资源,包括团队,服务,和经验丰富的ACS专家团队来满足客户在云计算时代的需求。
√自动化: 运营的最终目的是满足业务的需求的同时提升效率,降低成本,通过Oracle ACS团队的长期稳定的服务质量,专业工具技能,和最佳实践的应用,从而达到推动客户平台的自动化水平和降低总拥有成本的目的。
√量身定制: ACS的服务是可以量身定制,通过将应用系统生命周期内的关键业务设计及不同的服务模块及项目,客户可以灵活地根据需求选择不同的服务内容,从而满足特定的业务需求。
绑定变量窥视
绑定变量窥视功能是数据库的一个特性,自ORACLE9i版本开始引入,默认是开启的。
“绑定变量窥视”表示,查询优化器在第一次调用游标时,会观察用户定义的绑定变量的值,允许优化器来确认过滤条件的选择性,以及是否使用绑定变量代替了常量。之后调用游标时不会出现窥视,且会根据指针共享标准来共享游标,即使随后的调用使用不同的绑定值。
使用绑定变量窥视,第一次解析包含绑定谓词的SQL语句时,优化器将查看绑定变量的值,并使用该值为查询创建执行计划。然后,不管更改的绑定值如何,该计划都将被存储并用于未来的所有执行。如果初始绑定值不能很好地代表将来执行查询时提供的其他值,那么,即使当前访问路径较优,也可能导致未来执行变差,甚至影响某些迭代的查询性能变慢。