最近有朋友在『云和恩墨大讲堂』微信群内咨询了一个问题:

复制,入库进程所有涉及主键列是varchar2类型的update语句,都被sys_op_c2c隐形转换,造成全表扫描。

这里引入了一个专有名词:sys_op_c2c 。这是什么东西呢?

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


我们来看一下这个问题的模拟。

SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(128));

Table created.

SQL> INSERT INTO T SELECT ROWNUM, OBJECT_NAME FROM ALL_OBJECTS;

72147 rows created.

SQL> CREATE INDEX IND_T_NAME ON T(NAME);

Index created.

首先我们看,当使用VARCHAR2类型的查询参数输入是,获得的执行计划是索引范围扫描:

可以当我们指定NVARCHAR2的类型输入时,其执行计划变更为全表扫描,谓词信息部分提示,通过SYS_OP_C2C进行了过滤。

那么如何解决这类问题呢?

如果传入的数据类型有误,纠正之;或者创建函数索引,Oracle 就能够使用这个索引。

SQL> CREATE INDEX IND_T_NNAME ON T(TO_NCHAR(NAME));

Index created.

当然在创建索引时,你也可以使用内部函数SYS_OP_C2C,两者是完全相同的:

CREATE INDEX IND_T_NNNAME ON T(SYS_OP_C2C(NAME));

在MOS上的文档:732666.1 记录了类似这样一个案例。其解决方案中提到,在JDBC的设置中,可能因为 defaultNChar 的设置,导致传入值都被作为NVARCHAR2:

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

<connection-property name="defaultNChar">true</connection-property>

对于这一类问题的关键,就是找出在哪一个环节造成的数据类型不一致,并最终修正之。


资源下载

关注公众号:数据和云(OraNews)回复关键字获取

2018DTCC , 数据库大会PPT

2017DTC,2017 DTC 大会 PPT

DBALIFE ,“DBA 的一天”海报

DBA04 ,DBA 手记4 电子书

122ARCH ,Oracle 12.2体系结构图

2017OOW ,Oracle OpenWorld 资料

PRELECTION ,大讲堂讲师课程资料

近期文章

仅仅使用AWR做报告? 性能优化还未入门

实战课堂:一则CPU 100%的故障分析

杨廷琨:如何编写高效SQL(含PPT)

一份高达555页的技术PPT会是什么样子?

大象起舞:用PostgreSQL解海盗分金问题

SQL优化:你真的知道国家字符集的性能影响吗?相关推荐

  1. 智能SQL优化工具--SQL Optimizer for SQL Server(帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 )...

    SQL Optimizer for SQL Server 帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 SQL Optimizer for SQL Server 让 SQL Serve ...

  2. mysql 嵌套查询性能_mysql SQL优化之嵌套查询-遁地龙卷风

    (-1) 写在前面 这篇随笔的数据使用的是http://blog.csdn.net/friendan/article/details/8072668#comments里的,里面有一些常见的select ...

  3. SQL 优化核心思想

    SQL 优化核心思想 SQL 优化必懂的概念 概念 英文 含义 影响 示例 计算 临界 基数 Cardinality 某个列唯一键(Distinct Keys)的数量 基数的高低影响列的数据分布 性别 ...

  4. 18000字的SQL优化大全,收藏直接起飞!

    来源:数据分析不是个事儿 很多朋友在做数据分析时,分析两分钟,跑数两小时? 在使用SQL过程中不仅要关注数据结果,同样要注意SQL语句的执行效率. 本文涉及三部分,篇幅较长,建议收藏后翻看: SQL介 ...

  5. 数据库应用+SQL优化+Git

    数据库应用 1.1 概念 1.1.1 什么是数据库 1.1.2 关系型和非关系型 1.1.3 关系型数据库 1.2 Mysql数据库 1.2.1 MySQL数据存放在哪里? 1.2.2 MySQL服务 ...

  6. 《收获,不止SQL优化》读书笔记

    整体性能分析 AWR.ASH.ADDM.AWRDD 整体分析调优工具 AWR:关注数据库的整体性能的报告: ASH:数据库中的等待事件与哪些SQL具体对应的报告: ADDM:oracle给出的一些建议 ...

  7. 18000 字的 SQL 优化大全,收藏直接起飞!

    导读:很多朋友在做数据分析时,分析两分钟,跑数两小时?在使用SQL过程中不仅要关注数据结果,同样要注意SQL语句的执行效率. 本文涉及三部分,篇幅较长,建议收藏后翻看: SQL介绍 SQL优化方法 S ...

  8. 史上最全SQL优化方案(二)

    接上篇!! 4 基础优化 a 优化思路 定位问题点吮吸:硬件–>系统–>应用–>数据库–>架构(高可用.读写分离.分库分表). 处理方向:明确优化目标.性能和安全的折中.防患未 ...

  9. 中秋节,送上一次非常有趣的SQL优化实战经历

    点击上方"搜云库技术团队",选择"设为星标" 回复"1024"或"面试题"获取4T学习资料 补充:看到好多朋友后台留言说 ...

最新文章

  1. VC下提前注入进程的一些方法2——远线程带参数
  2. 由粗到精学习LVI-SAM基础:多传感器内外参标定原理
  3. openfire 插件开发
  4. Object.keys方法拿到对象的key值
  5. 计算1!+2!+...+n!
  6. 《FusionCharts学习及使用笔记》之 第一篇
  7. 用 或 || 取代常规 if - else 结构
  8. 转载 java抽象类与接口的区别
  9. 【emWin】例程十:bmp图片显示
  10. wpewebkit在ubuntu18.04上编译配置
  11. 前端基础练习项目——网页版扫雷
  12. 大数据培训:hadoop基础教程
  13. 关于魔兽的电脑优化配置方法
  14. 【Android Studio】如果你不管怎么折腾都提示Minimum supported Gradle version is 7.0.2. Current version is 6.8,请看这里
  15. 【安全】如何防止他人恶意调试你的web程序
  16. kanziopengl杂谈
  17. 雷军在北京大学的演讲
  18. vuejs的学习笔记
  19. 世界节约水资源日PPT模板
  20. android sdk manager 快速下载sdk

热门文章

  1. Bootstrap让内容块居中
  2. 定制Bootstrap3
  3. c语言链表错误,C语言创建链表错误之通过指针参数申请动态内存实例分析
  4. Linux 编译pe,如何在PE中将PE(可移植可执行文件)格式转换为ELF
  5. 精密制造业行业_精密制造业行业前景(全球精密制造业排名)
  6. python二进制图片压缩传输_python 中 base64 压缩图片,用post传送
  7. 中移物联网答案java_【分享】中移物联网校园招聘笔试-java
  8. 2,上传电影,udp,异常处理,socketserver
  9. 实验吧之【Forms、天网管理系统】
  10. 七:Java之封装、抽象、多态和继承