生产案例
突然发现生产环境mybatis执行一条简单的查询操作耗时很久,觉得有点奇怪,通过PLSQL按F5看执行计划,发现其中有一个表执行的是全表扫描,索引失效了?研究了很久也没发现问题!最后发现是当局者迷。
sql大概如下:
select t1.name from table1 t1,table2 t2 where t1.actionid=t2.actionid and t2.cstm_no='1';
我在他table1的actionid加了索引,在table2表的cstm_no也加上了索引,可惜结果却只有cstm_no索引生效,table1却用了全表扫描!
想了很久也想不通,因为这两个表都不是我建的,所以我自动忽略了一些基本事实原则!
单独把table1拿出来
select t1.name from table1 t1 where t1.actionid='123123';
完美的执行了索引查询!
原因
最后才发现,这两个表的actionid字段类型不同,table1是varchar2,table2是number!我的天!
解决办法
1、修改sql,加上to_char
select t1.name from table1 t1,table2 t2 where t1.actionid=to_char(t2.actionid) and t2.cstm_no='1';
这种情况需要改代码,但是改动不多!
2、修改表字段类型
直接把table1改为number即可,但是需要做一些备份然后再修改
这种情况下也要改代码,代码里保存的时候actionid就不能用varchar2了。
总结
多么智障的错误啊!