当前位置: 首页 > Oracle, oracle 10g, oracle 11g > 正文

有关ORACLE10gR2新特性returned 应用方案

1.问题描述
在之前测试人员反映,当导入图片数据的时候较慢,ADDM报告中存在以下和导入图片相关的耗时较大的SQL。

查找结果 3: 顶级 SQL 语句
受影响的是 .12 个活动会话, 占总活动的 18.1%。
------------------------------
发现 SQL 语句消耗了大量数据库时间。这些语句提供了改善性能的绝佳机会。
   建议案 1: SQL 优化
   估计的收益为 .12 个活动会话, 占总活动的 18.1%。
   -------------------------------
   操作
      研究 UPDATE 语句 (SQL_ID 为 "akqx47xp7tr8c"), 确定是否可以改善性能。
      可以利用此 SQL_ID 的 ASH 报告来补充此处给出的信息。
      相关对象
         SQL_ID 为 akqx47xp7tr8c 的 SQL 语句。
         update IMAGE set IMAGES=:1 where FILE_PATH=:2
   原理
      SQL 在 CPU, I/O 和集群等待上花费的时间只占其数据库时间的 28%。因此,
      SQL 优化指导不适用于这种情况。请查看 SQL 的性能数据以找出可能的改进方法。
   原理
      此 SQL 的数据库时间由以下部分构成: SQL 执行占 100%, 语法分析占 0%,
       PL/SQL 执行占 0%, Java 执行占 0%。
   原理
    SQL_ID 为 "akqx47xp7tr8c" 的 SQL 语句执行了 1573 次, 每次执行平均用时 0.11 秒。

2.问题原因
应用程序在插入一条图片记录的流程是:首先插入条目数据,然后根据条目数据信息查出这条记录,再做UPDATE操作,将图片插入到LOB字段内,这就相当于做了3个操作INSERT、SELECT、UPDATE,这种方式效率低下,建议应用ORACLE 10gR2的新特性returned来实现插入图片操作,这样一条SQL就可以实现该需求。
3.解决方法和案例演示
下面是利用10gR2的returned新特性,插入一条CLOB数据的案例演示。

SQL> CREATE TABLE T_TEST(ID NUMBER,NAME VARCHAR2(30),CONTENTS CLOB);

表已创建。

插入一条含有CLOB字段的记录。

SQL> declare
  2  v_lob clob;
  3  v_str varchar2(4000) := lpad('a', 4000, 'a');
  4  begin
  5  insert into t_test values (1, 'abcd', empty_clob())
  6  return contents into v_lob;
  7  dbms_lob.write(v_lob, length(v_str), 1, v_str);
  8  commit;
  9  end;
 10  /

PL/SQL 过程已成功完成。

查看插入的记录。

SQL> select * from t_test;

ID NAME   CONTENTS
-- ------ --------------------------------------------------------
1 abcd   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
         aaaaaaaaaaaaaaaaaaaaaaa

这样只用一个SQL就可以把含有LOB字段的数据插入到数据库中,而不需要做(INSERT、SELECT、UPDATE)三个操作,下面是ORACLE官方文档中的案例演示。

Example of DML Returning
This section provides two code examples of DML returning.
The following code example illustrates the use of DML returning.
In this example, assume that the maximum size of the name column
is 100 characters. Because the maximum size of the name column is
 known, the registerReturnParameter(int paramIndex, int externalType,
int maxSize) method is used.
...
OraclePreparedStatement pstmt = (OraclePreparedStatement)conn.prepareStatement(
       "delete from tab1 where age < ? returning name into ?");
pstmt.setInt(1,18);
/** register returned parameter
  * in this case the maximum size of name is 100 chars
  */
pstmt.registerReturnParameter(2, OracleTypes.VARCHAR, 100);
// process the DML returning statement
count = pstmt.executeUpdate();
if (count>0)
{
  ResultSet rset = pstmt.getReturnResultSet(); //rest is not null and not empty
  while(rset.next())
  {
    String name = rset.getString(1);
    ...
  }
}
...

4.建议
由于应用程序每次插入的数据条数较多,如果用之前的方法,INSERT、SELECT、UPDATE操作都很多,而且UPDATE操作效率低下,建议使用ORACLE 10gR2的新特性returned来实现插入图片操作。

本文固定链接: http://www.dbdream.com.cn/2012/01/%e6%9c%89%e5%85%b3oracle10gr2%e6%96%b0%e7%89%b9%e6%80%a7returned-%e5%ba%94%e7%94%a8%e6%96%b9%e6%a1%88/ | 信春哥,系统稳,闭眼上线不回滚!

该日志由 dbdream 于2012年01月04日发表在 Oracle, oracle 10g, oracle 11g 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 有关ORACLE10gR2新特性returned 应用方案 | 信春哥,系统稳,闭眼上线不回滚!
关键字: , ,

有关ORACLE10gR2新特性returned 应用方案:目前有1 条留言

  1. 沙发
    Kamus:

    有测试效率提高多少吗?

    2012-01-06 15:16 [回复]

发表评论

快捷键:Ctrl+Enter