SQL 里的格式转换,用得太多真挺坑性能的。是写复杂查询的时候,一个TO_NUMBER
或者TO_CHAR
埋在WHERE
里,基本就把索引给废了。文章《在查询时尽量少用格式转换-ORACLE_SQL 性能优化(全)》讲得蛮实在,场景、代码、问题点都有,建议你看看。
性能卡顿的 SQL,大多跟WHERE
里的格式转换脱不了关系。举个例子:
WHERE TO_NUMBER(substr(a.order_no, instr(b.order_no, '.') - 1)) = TO_NUMBER(substr(a.order_no, instr(b.order_no, '.') - 1))
看着就头疼吧?而如果能直接写成WHERE a.order_no = b.order_no
,不光读得清爽,响应也快。这样一改,索引能用上,查询速度嗖嗖的。
想了解更多实战优化案例,可以顺手看看这些:
- Oracle SQL 查询优化减少格式转换提升性能
- 避免使用格式转换提升 ORACLE_SQL 查询性能全面优化
- 优化 SQL 性能最小化格式转换的查询方法
- 浮点格式转换
- Sql Server 日期格式转换操作指南
如果你写ORACLE
的时候发现索引老是失效,或者慢得离谱,嗯,多半是格式转换惹的祸。能不用就不用,是在WHERE
和JOIN
条件里。调性能就是这种细节活儿,省一个转换,省几千毫秒。