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


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

    复制,入库进程所有涉及主键列是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解海盗分金问题


  • 相关阅读:
    android数据恢复
    UVA 690 Pipeline Scheduling
    2017 国庆湖南 Day4
    2017 国庆湖南 Day5
    2017 国庆湖南 Day6
    2017国庆 清北学堂 北京综合强化班 Day1
    2017 国庆湖南Day2
    bzoj 2962 序列操作
    UVA 818 Cutting Chains
    UVA 211 The Domino Effect
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13312357.html
Copyright © 2020-2023  润新知