ITPub博客

首页 > 数据库 > Oracle > [20160113]不要乱用国际化函数.txt

[20160113]不要乱用国际化函数.txt

原创 Oracle 作者:lfree 时间:2016-01-13 10:05:42 0 删除 编辑

[20160113]不要乱用国际化函数.txt

--生产系统上午使用perf检查发现:

#  perf top -k /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle

PerfTop:    6443 irqs/sec  kernel:47.0%  exact:  0.0% [1000Hz cycles],  (all, 24 CPUs)
------------------------------------------------------------------------------------------------------------------------

             samples  pcnt function               DSO
             _______ _____ ______________________ ______________________________________________________________________

             2125.00  4.8% lxpcget                /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle
             2113.00  4.8% lxoBinCmpMutl          /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle
             1608.00  3.6% lxgcvp                 /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle
             1340.00  3.0% lxoCmpStr              /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle
             1203.00  2.7% lxmcpen                /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle
             1196.00  2.7% lxsCmpStr              /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle
             1158.00  2.6% evastr                 /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle
             1078.00  2.4% kcbgtcr                /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle
             1025.00  2.3% kpofcr                 /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle
              807.00  1.8% lxgcnvb                /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle

--从来没有看到lx开头的函数排在前面.我们一般kcbgtcr排在前面,这个主要是逻辑读.而且现在刚刚上班9点多,没有到业务高峰.

SELECT sql_id, COUNT (*)
    FROM V$ACTIVE_SESSION_HISTORY
   WHERE sample_time > SYSDATE - 10 / 1400
GROUP BY sql_id
ORDER BY 2 DESC;

SQL_ID          COUNT(*)
------------- ----------
                     310
7xtuxjbw6x9qq        162
gc292abmax9gd         51
g7k9fgfzdb8j4         37
....

--检查发现开发的sql语句使用错误的函数to_nchar,这样无法找到满足条件的结果.由于生产系统语句复杂,通过例子来说明:

SCOTT@book> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SCOTT@book> select dump(to_nchar(deptno)) c30 ,dump(to_char(deptno)) c20 ,t.* from dept  t;
C30                            C20                      DEPTNO DNAME          LOC
------------------------------ -------------------- ---------- -------------- -------------
Typ=1 Len=4: 0,49,0,48         Typ=1 Len=2: 49,48           10 ACCOUNTING     NEW YORK
Typ=1 Len=4: 0,50,0,48         Typ=1 Len=2: 50,48           20 RESEARCH       DALLAS
Typ=1 Len=4: 0,51,0,48         Typ=1 Len=2: 51,48           30 SALES          CHICAGO
Typ=1 Len=4: 0,52,0,48         Typ=1 Len=2: 52,48           40 OPERATIONS     BOSTON

--可以发现dump(to_nchar(deptno)) ,dump(to_char(deptno))两者是不等的,所以讲没有国际化需求不要乱用这些函数.
--我们应用一些字段存在隐式转换,或者类型不一致,导致开发使用错误的函数或者不理解为什么,导致后台cpu忙.

--打开2个窗口:

# perf top -k  /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle

--另外一个执行:
SCOTT@book> set autot traceonly
SCOTT@book> select to_nchar(rownum) c10,to_nchar(rownum+1),to_nchar(rownum-1) from dual connect by 1=1;
ERROR:
ORA-30009: Not enough memory for CONNECT BY operation

--我的条件1=1,这样无限输出,不断的调用to_nchar函数.直到没有足够的内存,可以执行多次.回到另外一个窗口观察,可以发现都是lx开头的函数.
--基本与我前面生产系统遇到的问题一样.

   PerfTop:    3332 irqs/sec  kernel:62.4%  exact:  0.0% [1000Hz cycles],  (all, 24 CPUs)
-----------------------------------------------------------------------------------------------------------------

             samples  pcnt function               DSO
             _______ _____ ______________________ _______________________________________________________________

              802.00 10.4% lxpcget                /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle
              581.00  7.6% lxgcvp                 /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle
              504.00  6.6% lxoBinCmpMutl          /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle
              478.00  6.2% lxoCmpStr              /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle
              429.00  5.6% evastr                 /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle
              379.00  4.9% lxmcpen                /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle
              369.00  4.8% lxsCmpStr              /u01/app/oracle/product/11.2.0.4/dbhome_1/bin/oracle
              289.00  3.8% lxoSkip                /u01/app/oracle/product/11.2.0.4/dbhome_1/lib/libclntsh.so.11.1


--可以发现一个简单to_nchar函数,后台oracle调用的内部函数有多少.

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-1975690/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969407