ORACLE cursor_sharing参数导致函数索引失效
数据库版本为:11.2.0.4
当cursor_sharing为SIMILAR或者FORCE时候,将会导致函数索引失效;
表doc_order_header列有LASTSHIPMENTTIME得函数索引;
当时通过v$session视图发现,过滤条件to_char(h.lastshipmenttime,:"YYYY-MM-DD")=xxx被转换为
to_char(h.lastshipmenttime,:"SYS_B_0")=xxx,开始怀疑和oracle强制绑定变量有关;
SQL执行计划:
SQL_ID fv6z9b3xavdkx, child number 0
-------------------------------------
select count(*) from wms_user.doc_order_header h where
to_char(h.lastshipmenttime,:"SYS_B_0")=:"SYS_B_1"
Plan hash value: 3276129394
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 1325K(100)| |
| 1 | SORT AGGREGATE | | 1 | 8 | | |
|* 2 | TABLE ACCESS FULL| DOC_ORDER_HEADER | 229K| 1791K| 1325K (1)| 04:25:07 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(TO_CHAR(INTERNAL_FUNCTION("H"."LASTSHIPMENTTIME"),:SYS_B_0)=:SYS_B_1)
加入hint后/*+ CURSOR_SHARING_EXACT */
sys@JXDSP>select /*+ CURSOR_SHARING_EXACT */count(*) from wms_user.doc_order_header h
2 where to_char(h.lastshipmenttime,'YYYY-MM-DD')='2021-12-02';
COUNT(*)
----------
169513
Execution Plan
----------------------------------------------------------
Plan hash value: 3002984962
------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 7 | 606 (1)| 00:00:08 |
| 1 | SORT AGGREGATE | | 1 | 7 | | |
|* 2 | INDEX RANGE SCAN| IDX_LASTSHIPMENTTIME | 229K| 1567K| 606 (1)| 00:00:08 |
------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access(TO_CHAR(INTERNAL_FUNCTION("LASTSHIPMENTTIME"),'YYYY-MM-DD')='2021-12-02')
查询mos后,确实是oracle一个bug;
通过hint和alter session set CURSOR_SHARING=exact可临时解决;
有对应得补丁可解决问题;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2019-12-03 你需要一颗强大的脑壳,来买核桃!!
2019-12-03 误删表或记录