oracle表字段类型,与业务SQL不合理,导致的隐式转换

  

今天遇到一个生产问题,业务SQL很简单,单表查询,而且表只有三个字段,有个主键ID,而且通过主键ID过滤,业务页面会传一百多过个ID来调用SQL,这个表数据量大小为100多万,但是偏偏这条SQL执行跑了15秒,完全影响业务不能使用。

  

选择a, b, c t, t。(1111年,222333444555年.......... id)

  

我一开始并没有去查看表设计,而是直接看了执行计划,

  

1改变会话设置statistics_level=,
2执行SQL select * from
3表(dbms_xplan。display_cursor(空,空,最后ALLSTATS)

  

执行计划直接走了全表扫描,而在谓词过滤的信息里有一堆的

  

to_number (t.id)=1111或to_number (t.id)=2222 ..............

  

看到这里立马就猜想到了具体的问题所,在查询T表ID字段,是VARCHAR2类型,而SQL的是数字类型,SQL直接被隐式转换后,便走不了索引了,直接走了全表。这个问题后续才发现,也是因为业务不关注,在表数据日益上涨之后,性能问题日益凸显才被抛出来

oracle表字段类型,与业务SQL不合理,导致的隐式转换