美文网首页
Oracle入参类型不对导致索引失效

Oracle入参类型不对导致索引失效

作者: 左轮Lee | 来源:发表于2019-02-02 15:51 被阅读0次

DB : oracle 11.2.0.4
OS: Linux 2.6.32-573.12.1.el6.x86_64

发现问题

新开发的项目,上线后监控发现db主机cpu负载增加一倍,由原来的10%变成20%!

zabbix cpu load.jpg

排查问题

通过v$session 抓到正在执行的sql:

SELECT SUPP_GOODS_ID, update_time FROM SUPP_GOODS WHERE :"SYS_B_0"=:"SYS_B_1"   AND update_time > :1;

有多个类似这种根据update_time条件来扫描数据的sql。
分析该表的索引发现这类表的update_time字段均没有索引,不明白为何压测能通过。
正常应该是需要走仿真环境压测,可能由于数据量原因导致问题没暴露出来。

第一反应,加上索引:

create index IDX_SUPP_GOODS_UPTIME on SUPP_GOODS (UPDATE_TIME) ;

继续观察,发现一个奇怪的现象,从数据库v$sqlarea 里抓到的sql是可以走索引的,而且找开发抓了后台日志的sql,也是ok的。但是查看ash视图,还是不走索引,于是通过cursor_id 查看真实的执行计划,如下:


真实执行计划.png

这里发现谓词那里走了 internal_function 函数,应该是发生了隐式转换,于是查看下绑定变量的值:


绑定变量.jpg
看到DATATYPE_STRING字段,差不多可以确定问题了。
UPDATE_TIME字段类型为 date,与传入参数timestamp之间发生了隐士转换,导致索引失效。

字段类型是timestamp:
>to_date() 可以走索引;
>timestamp 可以走索引;
字段类型是date:
>to_date() 可以走索引;
>timestamp 不走索引。

所以这里就是 >timestamp 不走索引的情况,让开发改下代码,把值to_date()一下再传进来,就ok了。

观察负载情况,降下来了:


cpu load.jpg

相关文章

  • Oracle入参类型不对导致索引失效

    DB : oracle 11.2.0.4OS: Linux 2.6.32-573.12.1.el6.x86_64 ...

  • 数据库篇

    1、mysql索引在什么情况下回失效1、查询条件包括or可能导致索引失效2、查询时字段类型是字符串,where时参...

  • TypeScript接口

    属性类型接口 函数类型接口 定义了函数的参数。包括入参和出参。 可索引类型接口 类类型接口

  • Oracle索引失效

    问题 在t_freeproduct_info表prod_id varchar2(100)字段加上索引后,使用 查询...

  • 学习typescript - Interfaces

    函数入参限制 interface函数入参 可选属性 只读属性 只读数组 接口添加索引名称 接口规定类类型 - 属性...

  • MySql优化

    1.索引失效原因 2.Orcale自增ID 3.Oracle去重复

  • 索引失效7字真言

    模型数空运最快 模->模糊查询 like 如果以%开头,索引会失效。 型->如果数据类型错误了,索引会失效。 数-...

  • 面试总结

    mysql 索引的类型、索引的底层结构、索引失效的情况聚簇索引和非聚簇索引mysql的隔离级别, innerdb默...

  • new URLSearchParams()

    后台定义long类型前台传参string 失效问题new URLSearchParams()

  • oracle 使索引临时失效

    参考 使索引临时失效

网友评论

      本文标题:Oracle入参类型不对导致索引失效

      本文链接:https://www.haomeiwen.com/subject/vfiksqtx.html