热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

【翻译自mos文章】SYS_OP_C2C导致的全表扫描(fts)/全索引扫描

SYS_OP_C2C导致的全表扫描(fts)全索引扫描参考原文:SYS_OP_C2CCausingFullTableIndexScans(DocID732666.1)适用于:OracleDatabase

SYS_OP_C2C 导致的全表扫描(fts)/全索引扫描 参考原文: SYS_OP_C2C Causing Full Table/Index Scans (Doc ID 732666.1) 适用于: Oracle Database - Enterprise Edition - Version 10.1.0.2 to 12.1.0.1 [Release 10.1 to 12.1] Information in this docu

SYS_OP_C2C 导致的全表扫描(fts)/全索引扫描

参考原文:
SYS_OP_C2C Causing Full Table/Index Scans (Doc ID 732666.1)

适用于:
Oracle Database - Enterprise Edition - Version 10.1.0.2 to 12.1.0.1 [Release 10.1 to 12.1]
Information in this document applies to any platform.
This problem can occur on any platform.

症状:
1)正在执行一个带有绑定变量的查询
2)绑定变量经由application(.net, j2ee等)使用 "string" 类型的绑定变量来绑定。
3)该查询错误的执行了全表扫描/索引扫描,而没有使用索引唯一扫描或者索引范围扫描
4)使用advanced 选项查看explain plan, sqltxlain or 10053 trace,你会注意到在"Predicate Information"部分 会显示一个 "filter(SYS_OP_C2C)".

e.g select * from table(dbms_xplan.display_cursor(&sql_id,null,'ADVANCED'));

Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(SYS_OP_C2C("COL1")=:B1) <=== filter operation occurring

原因:

"string" 绑定变量 与 table 中的该 column 使用了不同的数据类型
这意味着 当执行这个查询的时候,需要把数据进行一个隐式类型转换。 SYS_OP_C2C 是一个隐式函数(implicit function),该函数用于字段(列)在nchar和char之间转换

解决方案:

1. 建立一个基于函数的索引。
e.g create index on (SYS_OP_C2C());

或者:

2.让绑定变量定义的数据类型与该列的数据类型一致。
A java example where this can occurs is when defaultNChar=TRUE. This will cause strings to bind as NVARCHAR2 causing the predicate that are subset datatypes to be converted to NVARCHAR2.
e.g. -Doracle.jdbc.defaultNChar=true
true


推荐阅读
author-avatar
鹰击长空1943
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有