Chinaunix首页 | 论坛 | 博客
  • 博客访问: 539910
  • 博文数量: 128
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 1345
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-22 21:43
文章分类

全部博文(128)

文章存档

2009年(30)

2008年(98)

我的朋友

分类: Oracle

2009-05-11 15:16:46

今天测试了一下abatis和spring架构下,Oracle的绑定变量,得出结论,abatis是使用的软解析,相比硬解析是优秀了些,但对于存储过程的无解析,还是有差距的

abatis的代码很简单,如果:
nation.xml :


    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
    "">



    
    
   
     


NationImp.java:

package com.teapot.data;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import java.util.List;
import org.apache.log4j.Logger;

public class NationImp extends SqlMapClientDaoSupport {
     
    static Logger logger = Logger.getLogger(NationImp.class);
   
    public List queryAllNation() {
        List l = getSqlMapClientTemplate().queryForList("CRM.getAllNation", null);
        logger.info("nation.getAllNation GetSize : " + l.size());
        return l;
    }
   
    public List queryNation() {
        List l = getSqlMapClientTemplate().queryForList("CRM.getNation", "1");
        logger.info("nation.queryNation GetSize : " + l.size());
        return l;
    }
}

调用:
<%
    WebApplicationContext wac = (WebApplicationContext) config.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

    NationImp ni = null;
    List l = null;
   
    ni = (NationImp)wac.getBean("NationImp");
    for (int i = 0; i < 36600; i++)
    {
        l = ni.queryNation();
    }
%>

通过tkprof,得到的执行结果如下:
可能得知,ibatis是使用了软解析

SELECT NATIONCODE,             NATIONNAME       
FROM
 NATION       WHERE NATIONNAME=:1   


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse    36600      0.68       0.61          0          0          0           0
Execute  36600      1.28       1.12          0          0          0           0
Fetch    36600      1.87       1.77          0     256200          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total   109800      3.84       3.51          0     256200          0           0

从共享池中抓出SQL的执行情况:
SQL> SELECT sql_text, sorts, executions, users_executing,
  2         TO_DATE(first_load_time, 'rrrr-mm-dd/hh24:mi:ss'),
  3         invalidations, parse_calls, disk_reads,s.buffer_gets,rows_processed,
  4         optimizer_mode, optimizer_cost, RAWTOHEX(address) address ,
  5         hash_value, u.username parsing_username,
  6         s.buffer_gets*100/total.buffer_gets pct_total_gets,
  7         s.buffer_gets/DECODE(s.rows_processed,0,1,s.rows_processed) gets_per_row
  8    FROM v$sql s,
  9         all_users u,
 10         (SELECT SUM(buffer_gets) buffer_gets FROM v$sql) total
 11   WHERE u.user_id=s.parsing_user_id AND executions > 0
 12   and u.username like 'CRM'
 13   ORDER BY executions asc;
 
SQL_TEXT                                                                              SORTS EXECUTIONS USERS_EXECUTING TO_DATE(FIRST_LOAD_TIME,'RRRR- INVALIDATIONS PARSE_CALLS DISK_READS BUFFER_GETS ROWS_PROCESSED OPTIMIZER_MODE OPTIMIZER_COST ADDRESS  HASH_VALUE PARSING_USERNAME               PCT_TOTAL_GETS GETS_PER_ROW
-------------------------------------------------------------------------------- ---------- ---------- --------------- ------------------------------ ------------- ----------- ---------- ----------- -------------- -------------- -------------- -------- ---------- ------------------------------ -------------- ------------
SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE NO_PARALLEL(SAMPLESUB          0          1               0 2009-05-12 12:28:17                        0           1          0           7              1 ALL_ROWS                    3 3EB3102C 4135079179 CRM                            0.005405572372            7
SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE NO_PARALLEL(SAMPLESUB          0          1               0 2009-05-12 12:28:15                        0           1          5           7              1 ALL_ROWS                    3 3EB3F080 2209843099 CRM                            0.005405572372            7
SELECT NATIONCODE,             NATIONNAME        FROM NATION       WHERE NATIONN          0       1000               0 2009-05-12 12:28:17                        0        1000          0        7030              0 ALL_ROWS                    3 3EB316A8  918026084 CRM                            5.428739111632         7030
SELECT COUNT(*) FROM nation                                                               0       1002               0 2009-05-12 12:28:15                        0        1002         13        3050           1002 ALL_ROWS                    2 3EB3FD68  451664816 CRM                            2.355285105331 3.0439121756


####################################################################################
而通过Oracle的存储过程执行:
得到了最完美的过程,如下:

已写入 file afiedt.buf

  1  declare
  2    a varchar2(100);
  3    b varchar2(100);
  4  begin
  5    for i IN 1..10000 LOOP
  6     select NATIONCODE,NATIONNAME into a, b FROM NATION WHERE NATIONNAME = '2';
  7    end loop;
  8* end;
CRM@ORCL> /

执行过程如下:

SELECT NATIONCODE,NATIONNAME
FROM
 NATION WHERE NATIONNAME = '2'


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.00          0          1          0           0
Execute  10000      0.26       0.26          0          0          0           0
Fetch    10000      0.50       0.46          0      70000          0       10000
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total    20001      0.78       0.73          0      70001          0       10000

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 30     (recursive depth: 1)




这里回顾一下,TOMKate的绑定变量:
硬解析:


not connected> conn crm/crm@peizf
已连接。
CRM@ORCL> alter session set sql_trace=true;

会话已更改。

CRM@ORCL> DECLARE
  2    TYPE rc IS REF CURSOR;
  3    l_rc rc;
  4    l_dummy all_objects.object_name%TYPE;
  5    l_start NUMBER DEFAULT dbms_utility.get_time;
  6  BEGIN
  7    FOR i IN 1..100 LOOP
  8      OPEN l_rc FOR
  9        'SELECT object_name from all_objects
 10          where object_id = ' || i;
 11      FETCH l_rc INTO l_dummy;
 12      CLOSE l_rc;
 13    END LOOP;
 14
 15    dbms_output.put_line(round((dbms_utility.get_time - l_start) / 100, 2) || ' seconds...');
 16  END;
 17  /

PL/SQL 过程已成功完成。


在tkprof的报告中,有许多解析过程,如下(这里取两个,还有好多),OLTP系统中,SQL写法最不可取的方式

SELECT object_name from all_objects
        where object_id = 23

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.04       0.04          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        1      0.00       0.00          0         19          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        3      0.04       0.04          0         19          0           0

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 30     (recursive depth: 1)

Rows     Row Source Operation
-------  ---------------------------------------------------
      0  FILTER  (cr=19 pr=0 pw=0 time=1396 us)
      1   NESTED LOOPS  (cr=6 pr=0 pw=0 time=155 us)
      1    TABLE ACCESS BY INDEX ROWID OBJ$ (cr=3 pr=0 pw=0 time=77 us)
      1     INDEX UNIQUE SCAN I_OBJ1 (cr=2 pr=0 pw=0 time=33 us)(object id 36)
      1    TABLE ACCESS CLUSTER USER$ (cr=3 pr=0 pw=0 time=50 us)
      1     INDEX UNIQUE SCAN I_USER# (cr=1 pr=0 pw=0 time=18 us)(object id 11)
      0   TABLE ACCESS BY INDEX ROWID IND$ (cr=0 pr=0 pw=0 time=0 us)
      0    INDEX UNIQUE SCAN I_IND1 (cr=0 pr=0 pw=0 time=0 us)(object id 39)
      0   HASH JOIN  (cr=2 pr=0 pw=0 time=255 us)
      0    INDEX RANGE SCAN I_OBJAUTH1 (cr=2 pr=0 pw=0 time=23 us)(object id 103)
      0    FIXED TABLE FULL X$KZSRO (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=43 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=27 us)
      0   TABLE ACCESS BY INDEX ROWID DEPENDENCY$ (cr=3 pr=0 pw=0 time=150 us)
      1    NESTED LOOPS  (cr=3 pr=0 pw=0 time=116 us)
      0     NESTED LOOPS  (cr=3 pr=0 pw=0 time=99 us)
      0      MERGE JOIN CARTESIAN (cr=3 pr=0 pw=0 time=87 us)
      0       TABLE ACCESS BY INDEX ROWID OBJ$ (cr=3 pr=0 pw=0 time=62 us)
      1        INDEX RANGE SCAN I_OBJ2 (cr=2 pr=0 pw=0 time=24 us)(object id 37)
      0       BUFFER SORT (cr=0 pr=0 pw=0 time=0 us)
      0        FIXED TABLE FULL X$KZSRO (cr=0 pr=0 pw=0 time=0 us)
      0      INDEX RANGE SCAN I_OBJAUTH1 (cr=0 pr=0 pw=0 time=0 us)(object id 103)
      0     INDEX RANGE SCAN I_DEPENDENCY1 (cr=0 pr=0 pw=0 time=0 us)(object id 122)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=24 us)
      0   NESTED LOOPS  (cr=2 pr=0 pw=0 time=28 us)
      0    INDEX RANGE SCAN I_OBJAUTH1 (cr=2 pr=0 pw=0 time=14 us)(object id 103)
      0    FIXED TABLE FULL X$KZSRO (cr=0 pr=0 pw=0 time=0 us)
      0   HASH JOIN  (cr=2 pr=0 pw=0 time=232 us)
      0    INDEX RANGE SCAN I_OBJAUTH1 (cr=2 pr=0 pw=0 time=17 us)(object id 103)
      0    FIXED TABLE FULL X$KZSRO (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=35 us)
      0   NESTED LOOPS  (cr=3 pr=0 pw=0 time=163 us)
      0    MERGE JOIN CARTESIAN (cr=3 pr=0 pw=0 time=150 us)
      0     TABLE ACCESS BY INDEX ROWID DEPENDENCY$ (cr=3 pr=0 pw=0 time=113 us)
      1      NESTED LOOPS  (cr=3 pr=0 pw=0 time=81 us)
      0       TABLE ACCESS BY INDEX ROWID OBJ$ (cr=3 pr=0 pw=0 time=64 us)
      1        INDEX RANGE SCAN I_OBJ2 (cr=2 pr=0 pw=0 time=25 us)(object id 37)
      0       INDEX RANGE SCAN I_DEPENDENCY1 (cr=0 pr=0 pw=0 time=0 us)(object id 122)
      0     BUFFER SORT (cr=0 pr=0 pw=0 time=0 us)
      0      FIXED TABLE FULL X$KZSRO (cr=0 pr=0 pw=0 time=0 us)
      0    INDEX RANGE SCAN I_OBJAUTH1 (cr=0 pr=0 pw=0 time=0 us)(object id 103)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=24 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   NESTED LOOPS  (cr=1 pr=0 pw=0 time=52 us)
      0    NESTED LOOPS  (cr=1 pr=0 pw=0 time=39 us)
      0     TABLE ACCESS BY INDEX ROWID TRIGGER$ (cr=1 pr=0 pw=0 time=27 us)
      0      INDEX UNIQUE SCAN I_TRIGGER2 (cr=1 pr=0 pw=0 time=14 us)(object id 126)
      0     INDEX RANGE SCAN I_OBJAUTH1 (cr=0 pr=0 pw=0 time=0 us)(object id 103)
      0    FIXED TABLE FULL X$KZSRO (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=24 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   VIEW  (cr=0 pr=0 pw=0 time=0 us)
      0    FAST DUAL  (cr=0 pr=0 pw=0 time=0 us)

********************************************************************************

SELECT object_name from all_objects
        where object_id = 24

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.04       0.04          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        1      0.00       0.00          0         22          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        3      0.04       0.04          0         22          0           0

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 30     (recursive depth: 1)

Rows     Row Source Operation
-------  ---------------------------------------------------
      0  FILTER  (cr=22 pr=0 pw=0 time=1656 us)
      1   NESTED LOOPS  (cr=6 pr=0 pw=0 time=413 us)
      1    TABLE ACCESS BY INDEX ROWID OBJ$ (cr=3 pr=0 pw=0 time=308 us)
      1     INDEX UNIQUE SCAN I_OBJ1 (cr=2 pr=0 pw=0 time=266 us)(object id 36)
      1    TABLE ACCESS CLUSTER USER$ (cr=3 pr=0 pw=0 time=77 us)
      1     INDEX UNIQUE SCAN I_USER# (cr=1 pr=0 pw=0 time=16 us)(object id 11)
      1   TABLE ACCESS BY INDEX ROWID IND$ (cr=3 pr=0 pw=0 time=45 us)
      1    INDEX UNIQUE SCAN I_IND1 (cr=2 pr=0 pw=0 time=18 us)(object id 39)
      0   HASH JOIN  (cr=2 pr=0 pw=0 time=223 us)
      0    INDEX RANGE SCAN I_OBJAUTH1 (cr=2 pr=0 pw=0 time=19 us)(object id 103)
      0    FIXED TABLE FULL X$KZSRO (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=56 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=29 us)
      0   TABLE ACCESS BY INDEX ROWID DEPENDENCY$ (cr=3 pr=0 pw=0 time=149 us)
      1    NESTED LOOPS  (cr=3 pr=0 pw=0 time=114 us)
      0     NESTED LOOPS  (cr=3 pr=0 pw=0 time=96 us)
      0      MERGE JOIN CARTESIAN (cr=3 pr=0 pw=0 time=83 us)
      0       TABLE ACCESS BY INDEX ROWID OBJ$ (cr=3 pr=0 pw=0 time=57 us)
      1        INDEX RANGE SCAN I_OBJ2 (cr=2 pr=0 pw=0 time=21 us)(object id 37)
      0       BUFFER SORT (cr=0 pr=0 pw=0 time=0 us)
      0        FIXED TABLE FULL X$KZSRO (cr=0 pr=0 pw=0 time=0 us)
      0      INDEX RANGE SCAN I_OBJAUTH1 (cr=0 pr=0 pw=0 time=0 us)(object id 103)
      0     INDEX RANGE SCAN I_DEPENDENCY1 (cr=0 pr=0 pw=0 time=0 us)(object id 122)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=23 us)
      0   NESTED LOOPS  (cr=2 pr=0 pw=0 time=25 us)
      0    INDEX RANGE SCAN I_OBJAUTH1 (cr=2 pr=0 pw=0 time=13 us)(object id 103)
      0    FIXED TABLE FULL X$KZSRO (cr=0 pr=0 pw=0 time=0 us)
      0   HASH JOIN  (cr=2 pr=0 pw=0 time=224 us)
      0    INDEX RANGE SCAN I_OBJAUTH1 (cr=2 pr=0 pw=0 time=13 us)(object id 103)
      0    FIXED TABLE FULL X$KZSRO (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=30 us)
      0   NESTED LOOPS  (cr=3 pr=0 pw=0 time=157 us)
      0    MERGE JOIN CARTESIAN (cr=3 pr=0 pw=0 time=145 us)
      0     TABLE ACCESS BY INDEX ROWID DEPENDENCY$ (cr=3 pr=0 pw=0 time=107 us)
      1      NESTED LOOPS  (cr=3 pr=0 pw=0 time=77 us)
      0       TABLE ACCESS BY INDEX ROWID OBJ$ (cr=3 pr=0 pw=0 time=60 us)
      1        INDEX RANGE SCAN I_OBJ2 (cr=2 pr=0 pw=0 time=22 us)(object id 37)
      0       INDEX RANGE SCAN I_DEPENDENCY1 (cr=0 pr=0 pw=0 time=0 us)(object id 122)
      0     BUFFER SORT (cr=0 pr=0 pw=0 time=0 us)
      0      FIXED TABLE FULL X$KZSRO (cr=0 pr=0 pw=0 time=0 us)
      0    INDEX RANGE SCAN I_OBJAUTH1 (cr=0 pr=0 pw=0 time=0 us)(object id 103)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=23 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   NESTED LOOPS  (cr=1 pr=0 pw=0 time=49 us)
      0    NESTED LOOPS  (cr=1 pr=0 pw=0 time=37 us)
      0     TABLE ACCESS BY INDEX ROWID TRIGGER$ (cr=1 pr=0 pw=0 time=25 us)
      0      INDEX UNIQUE SCAN I_TRIGGER2 (cr=1 pr=0 pw=0 time=12 us)(object id 126)
      0     INDEX RANGE SCAN I_OBJAUTH1 (cr=0 pr=0 pw=0 time=0 us)(object id 103)
      0    FIXED TABLE FULL X$KZSRO (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=24 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   FIXED TABLE FULL X$KZSPR (cr=0 pr=0 pw=0 time=0 us)
      0   VIEW  (cr=0 pr=0 pw=0 time=0 us)
      0    FAST DUAL  (cr=0 pr=0 pw=0 time=0 us)

********************************************************************************
阅读(2521) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~