什么是SYS_OP_C2C呢?官方的介绍如下:

SYS_OP_C2C is an internal function which does an implicit conversion of varchar2 to national character set using TO_NCHAR function. Thus, the filter completely changes as compared to the filter using normal comparison.

简单的来说,SYS_OP_C2C 是一个内部函数,功能是将VARCHAR2的数据类型转换成国家字符集的NVARCHAR2类型,内部通过TO_NCHAR函数实现。

其实为什么要介绍一下这个内部函数,是因为最近一个同事在优化一个SQL语句时,发现即使创建了相关字段的索引,但是SQL语句的执行计划仍然不走索引,而走全表扫描,个人在分析了后,发现即使这个索引涉及的三个字段的选择率不高,但是也不是不走索引的原因,而是因为隐式转换问题(全局临时表的跟物理表关联的字段数据类型不一致),如果Automatic SQL Tuning - SQL Profiles Tuning Advisor建议创建基于SYS_OP_C2C的函数索引,或者执行计划中有类似“ filter(SYS_OP_C2C(COLUMN).....”这样的信息,那么你应该检查是否出现了隐式类型转换(implicit type conversion)

什么是隐式类型转换(implicit type conversion)?

如果进行比较的两个值的数据类型不同,则 ORACLE 必须将其中一个值进行类型转换使其能够比较。这就是所谓的隐式类型转换。通常当开发人员将数字存储在字符列时会导致这种问题的产生。ORACLE 在运行时会强制转化其中一个值,(由于固定的规则)在索引字符列使用 to_number。由于添加函数到索引列所以导致索引不被使用。实际上,ORACLE 也只能这么做,类型转换是一个应用程序设计因素。由于转换是在每行都进行的,这会导致性能问题。详见:

Document 232243.1 ORA-01722 ORA-01847 ORA-01839 or ORA-01858 From Queries with Dependent Predicates

官方文档SYS_OP_C2C Causing Full Table/Index Scans (文档 ID 732666.1)中有介绍:

APPLIES TO:

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.

SYMPTOMS

1) You are executing a query using bind variables.

2) The binding occurs via an application (eg. .NET, J2EE ) using a "string" variable to bind.

3) The query is incorrectly performing a full table/index scan instead of an unique/range index scan.

4) When looking at advanced explain plan, sqltxplain or 10053 trace, you notice that the "Predicate Information" shows is doing a "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

CAUSE

The bind variable "string" is using a different datatype to the column that is being queried.

This means that an implicit conversion of the data is required to execute the query.  SYS_OP_C2C is the implicit function which is used to convert the column between nchar and char.

SOLUTION

1. Create a function based index on the column.

e.g create index on (SYS_OP_C2C());

OR

2. Ensure that your bind "string" datatype and column datatype are the same.

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

关于SYS_OP_C2C内部函数出现的可能原因,概况起来就是

1)正在执行一个带有绑定变量的查询

关于这个,以前也曾经遇到过这样的案例,参考这篇博文ORACLE绑定变量隐式转换导致性能问题

2)绑定变量经由application(.NET, J2EE等)使用 "string" 类型的绑定变量来绑定。

3)该查询错误的执行了全表扫描/索引扫描,而没有使用索引唯一扫描或者索引范围扫描

4)使用advanced 选项查看explain plan, sqltxlain or 10053 trace,你会注意到在"Predicate Information"部分  会显示一个 "filter(SYS_OP_C2C)".

解决方案:

1. 建立一个基于函数的索引。

e.g create index on (SYS_OP_C2C());

2. 让绑定变量定义的数据类型与该列的数据类型一致。

参考资料:

SYS_OP_C2C Causing Full Table/Index Scans (文档 ID 732666.1)

C&plus;&plus; 中operator用法:隐式类型转换

[转]C++ operator两种用法 C++,有时它的确是个耐玩的东东,就比如operator,它有两种用法,一种是operator overloading(操作符重载),一种是operator c ...

ORACLE隐式类型转换

隐式类型转换简介   通常ORACLE数据库存在显式类型转换(Explicit Datatype Conversion)和隐式类型转换(Implicit Datatype Conversion)两 ...

js隐式类型转换,预编译、递归、作用域,作用域链、闭包、立即执行函数、继承圣杯模式

隐式类型转换 调用Number()当有运算符(加减乘除,求余)时,会调用Number()转为数字再运算,除了 加 当 有字符串时就变身成拼接Boolean();String(); typeof()st ...

js条件判断时隐式类型转换

Javascript 中,数字 0 为假,非0 均为真 在条件判断运算 == 中的转换规则是这样的: 如果比较的两者中有布尔值(Boolean),会把 Boolean 先转换为对应的 Number,即 ...

dynamic&lowbar;cast 和 static&lowbar;cast 隐式类型转换的区别

首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...

c&plus;&plus; operator操作符的两种用法:重载和隐式类型转换,string转其他基本数据类型的简洁实现string&lowbar;cast

C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换.对于操作符的重载,许多人都不陌生,但是估计不少人都不太熟悉operator的第二种用法,即自定义对象类型的隐式 ...

C&plus;&plus;的隐式类型转换与转换操作符

C++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象).如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能.隐式转换的发生条件:函数调用中, ...

C&plus;&plus;的隐式类型转换

C++是一种复杂的语言,其中有许多“好玩”的特性,学习C++的过程就像在海边捡一颗颗石头,只要坚持不懈,也许一颗颗小石头也能建起你自己小小的城堡. 废话完后,讲讲自己捡到的石头:隐式类型转换 学习出处 ...

随机推荐

Java的内存机制

Java 把内存划分成两种:一种是栈内存,另一种是堆内存.在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空 ...

HTTP Session原理

深入理解HTTP Session   session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的 ...

大型系统OA--技术

OA办公自动化系统--技术 1.由于涉及企业的流程控制与规则管理.所以系统对于规范要求的严谨性,导致在小型开发组在进行开发时必须基于成熟的技术架构.开源的lemon OA,采用了如下技术细节: mys ...

区别CSS中display:box;inline;none以及HTML中 &lt&semi;frame&gt&semi; 标签&lt&semi;table&gt&semi; 标签的 frame 属性

区别display:box:display:inline:display:none三者的不同 display:block的特点是: block是Display默认的值.总是在新行上开始:该对象随后的内 ...

nodejs服务器部署教程二

这篇文章主要介绍如何在服务端跑vuejs的项目,如果上一篇教程你成功输出了hello world,那这一篇更简单 首先你要有一个已经能在本地跑的基于vuejs的项目,我就以之前写的仿饿了么的项目为例来 ...

2017-07-05 &lpar;whereis which find&rpar;

whereis whereis 命令名 作用 搜索命令所在的路径以及帮助文档所在的位置 选项 -b 搜索命令所在的位置 -m 搜索帮助文档所在的位置 例子 whereis ls  查看ls命令所在的位 ...

IDEA springboot 项目静态文件修改不更新的问题

springboot 项目的页面和静态文件,在项目启动后,修改无效.按照下面的配置可以解决问题. 1.file-setting 勾选项目自动构建 2.使用快捷键 ctrl+ shift+ alt + ...

PYTHON-面向对象-练习-王者荣耀 对砍游戏

# 王者荣耀 对砍游戏# 两个英雄可以对砍 如果血量小于等于0 就GG# 所需的对象# 英雄对象""" 亚瑟 属性 类型 血量 名称 技能 Q 跳起来给你一刀 伤害50 ...

BZOJ 2879 &lbrack;Noi2012&rsqb;美食节 &vert; 费用流 动态开点

这道题就是"修车"的数据加强版--但是数据范围扩大了好多,应对方法是"动态开点". 首先先把"所有厨师做的倒数第一道菜"和所有菜连边,然后跑 ...

Scala入门1(单例对象和伴生类)

一.Hello World程序的执行原理 参考http://blog.csdn.net/zhangjg_blog/article/details/22760957 object HelloWorld{ ...

oracle c op,ORACLE中内部函数SYS_OP_C2C和隐式类型转换相关推荐

  1. ORACLE隐式类型转换

      隐式类型转换简介   通常ORACLE数据库存在显式类型转换(Explicit Datatype Conversion)和隐式类型转换(Implicit Datatype Conversion)两 ...

  2. html中隐式转换成数字,详解JS中的隐式类型转换

    JS中隐式类型转换 JS中的数据类型 JS中的数据类型分为两大类: 1.基本数据类型: 1.String 字符串 表示一段文本,例如:人的姓名.地址等 2.Number 数值 3.Boolean 布尔 ...

  3. 关于android隐式启动activity的分析和说明,Android学习之Intent中显示意图和隐式意图的用法实例分析...

    本文实例讲述了Android学习之Intent中显示意图和隐式意图的用法.分享给大家供大家参考,具体如下: Intent(意图)主要是解决Android应用的各项组件之间的通讯. Intent负责对应 ...

  4. js中的隐式类型转换有哪些

    目录 一.隐式类型转换条件有哪些 二.== 的隐式类型转换 三.+ 的隐式类型转换 四.object 的隐式类型转换 1.探讨 object 的隐式转换执行顺序 2.探讨 Symbol.toPrimi ...

  5. Oracle 原理:游标,显示游标、隐式游标、参照游标

    Oracle 游标有三种:显示游标.隐式游标.参照游标. fetch...bulk collect into select 语句会把结果集全部返回给用户,而无法对结果集中的每行数据进行单独的操作.因此 ...

  6. 隐式类型转换中显式申明的非必要性

    一直都会有意无意地使用到类型的转换.int a = 5.23;string s = "abc" + intValue;也许在看书的时候你也会看到int a = (int)5.23; ...

  7. jQuery中事件及常用事件总结、jQuery中常见效果、隐式迭代、链式编程、样式操作、动画队列、不同元素绑定同一个事件

    jQuery事件: jQuery中的事件和javascript中的事件基本相似,不同的是jQuery中的事件处理函数写在事件后面的括号中,如: <script>$('input').cli ...

  8. Android学习记录(7)—Intent中显示意图和隐式意图的用法

    Intent(意图)主要是解决Android应用的各项组件之间的通讯. Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的 ...

  9. python selenium 中显示等待与隐式等待同时存在,发生冲突时,解决方法

    当我们在一个基类中写了一句隐式等待,如下面的 self.driver.implicitly_wait(30) 可以为整个程序都设置一个30秒的等待时间,但是当我们有段代码不想等待30秒这么久,那该怎么 ...

最新文章

  1. 妹妹生了个女儿,纪念一下
  2. NC45实现二叉树先序、中序和后序遍历
  3. Win 7 隐藏小功能——屏幕录制
  4. 苹果树的故事(转发的)
  5. 【Java 并发编程】线程池机制 ( 线程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor )
  6. 用MATLAB模拟天线接收信号时,突然出现一个干扰信号,并且干扰信号从0°开始,绕90°,观察SINR的变化规律
  7. 【python】【scrapy】使用方法概要(三)
  8. 易语言神经网络验证码识别_递归神经网络 GRU+CTC+CNN 教会验证码识别
  9. mac 无法识别android,mac 无法识别android真机
  10. 1.7_heap_sort_堆的向下调整堆排序
  11. 8.在第7步的基础上为我们的程序添加负载均衡支持
  12. python tkinter中的锚点(anchor)问题
  13. 计算机基础教程7 - 数字系统
  14. 机器学习笔记(二十五):支撑向量机(SVM)
  15. 运维小白linux基础知识总结
  16. PB入门:基础语法与操作
  17. 中奖名单模板_获奖名单公布模板速来选择
  18. C++complex复数类
  19. 嵌入式编程入门教程,学习设计嵌入式工程师
  20. 安卓adb工具的安装方法

热门文章

  1. linux建立虚拟硬盘,创建linux虚拟硬盘.doc
  2. 医疗大数据平台的主流解决方案和设计
  3. 微信小程序中获取用户微信运动信息
  4. 美国NeoCon展会观后体会,海沃氏Haworth时尚休闲风是否真的受追捧?
  5. 大数据挖掘企业服务平台-广电用户服务大数据解决方案
  6. ajax异步回调解析List集合
  7. 写文档,服务自己也服务大家,最终成就自己
  8. EMS邮箱数据库全局监控设置
  9. 什么是.NET Core ?它和.NET Framework 有什么不同?
  10. 解答关于企业私有云解决方案的疑问