Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

0

积分

1

好友

1

主题
1#
发表于 2013-7-9 11:46:12 | 查看: 3997| 回复: 1
本帖最后由 LuoLee.me 于 2013-7-9 11:47 编辑

在实际维护过程中有用户通过DBLink查询远程数据库的数据,但是远程的那张表中含有CLOB列,进而导致一条select要执行十几分钟到四十分钟左右。

我在使用环境中也进行了测试,发现只要查询中含有CLOB列,就会很慢,不知是什么原因,同时不知如何能规避这种问题。

以下是我的实验过程:

1、在远程库中建表:
     create table T_LILO as select * from dba_objects;
     insert into T_LILO select * from T_LILO;
     commit;
2、在本地库上建DBLink:
     create public database link dblilo connect to lilo identified by lilo using 'dblink';
3、在本地建临时表:
     create global temporary table GT_LILO_TEMP (owner varchar2(200), name varchar2(200));
4、准备本地环境:
     LILO@orcl>set timing on
     LILO@orcl>set time on
     15:39:09 LILO@orcl>show user
     USER is "LILO"
     15:39:15 LILO@orcl>
5、插入远程库上的表:
     15:39:49 LILO@orcl>insert into GT_LILO_TEMP (owner, name) select a.owner,a.object_name from T_LILO@DBLILO a;

     205608 rows created.

     Elapsed: 00:00:05.96
     15:39:56 LILO@orcl>

  可以看到这里如果远程表中不含有CLOB类型列的话,只用了6s。


6、回滚刚刚的插入:
     15:40:12 LILO@orcl>rollback;

     Rollback complete.
7、分别在本地和远程增加CLOB类型列:
  本地临时表:
     alter table GT_LILO_TEMP add (C_LOB CLOB);
  远端表:
     alter table T_LILO add (C_LOB CLOB);
8、在远程表中插入CLOB类型列:
     SQL> insert into T_LILO(C_LOB) select object_name from T_LILO;

     102804 rows created.

     SQL> commit;
9、在本地临时表中插入含有CLOB类型的列:
     15:41:06 LILO@orcl>insert into GT_LILO_TEMP (owner, name,C_LOB) select a.owner,a.object_name,a.c_lob from T_LILO@DBLILO a;

     205608 rows created.

     Elapsed: 00:01:45.72
     15:42:53 LILO@orcl>

  从这里看,时间有1分45s,时间是之前没有CLOB列的17倍。

  不知道是否有什么办法可以优化CLOB类型通过DBLink的查询、插入呢?

2#
发表于 2013-7-9 14:34:16
我觉得不是dblink的问题,首先clob类型的本身就比varchar2类型的耗费资源,实验如下:
  1. SQL> select * from v$version;

  2. BANNER
  3. --------------------------------------------------------------------------------
  4. Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
  5. create table t (id number,name varchar2(200));
  6. insert into t select object_id,object_name from dba_objects;
  7. commit;
  8. create table t2 (id number,name clob);
  9. insert into t2 select object_id,object_name from dba_objects;
  10. commit;
  11. SQL> set autot traceonly
  12. SQL> select * from t;

  13. 75348 rows selected.


  14. Execution Plan
  15. ----------------------------------------------------------
  16. Plan hash value: 1601196873

  17. --------------------------------------------------------------------------
  18. | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time         |
  19. --------------------------------------------------------------------------
  20. |   0 | SELECT STATEMENT  |         | 79315 |  8907K|   103   (1)| 00:00:02 |
  21. |   1 |  TABLE ACCESS FULL| T         | 79315 |  8907K|   103   (1)| 00:00:02 |
  22. --------------------------------------------------------------------------

  23. Note
  24. -----
  25.    - dynamic sampling used for this statement (level=2)


  26. Statistics
  27. ----------------------------------------------------------
  28.           4  recursive calls
  29.           2  db block gets
  30.        5459  consistent gets
  31.           0  physical reads
  32.           0  redo size
  33.     3516951  bytes sent via SQL*Net to client
  34.       55777  bytes received via SQL*Net from client
  35.        5025  SQL*Net roundtrips to/from client
  36.           0  sorts (memory)
  37.           0  sorts (disk)
  38.       75348  rows processed
  39. SQL> select * from t2;

  40. 75351 rows selected.


  41. Execution Plan
  42. ----------------------------------------------------------
  43. Plan hash value: 1513984157

  44. --------------------------------------------------------------------------
  45. | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time         |
  46. --------------------------------------------------------------------------
  47. |   0 | SELECT STATEMENT  |         | 62603 |   120M|   273   (1)| 00:00:04 |
  48. |   1 |  TABLE ACCESS FULL| T2         | 62603 |   120M|   273   (1)| 00:00:04 |
  49. --------------------------------------------------------------------------

  50. Note
  51. -----
  52.    - dynamic sampling used for this statement (level=2)


  53. Statistics
  54. ----------------------------------------------------------
  55.           4  recursive calls
  56.           2  db block gets
  57.       75472  consistent gets
  58.           0  physical reads
  59.           0  redo size
  60.    51865980  bytes sent via SQL*Net to client
  61.    24928142  bytes received via SQL*Net from client
  62.      150704  SQL*Net roundtrips to/from client
  63.           0  sorts (memory)
  64.           0  sorts (disk)
  65.       75351  rows processed
  66. 从上可以看出,同样的数据,但clob的逻辑读高10几倍。
  67. SQL> col segment_name for a20
  68. select segment_name, sum(bytes)/1024/1024 Mb from user_extents where segment_name in ('T','T2')
  69.   2  group by segment_name;

  70. SEGMENT_NAME                     MB
  71. -------------------- ----------
  72. T2                              8
  73. T                              3
复制代码
占用空间也不同,而且默认clob类型是in row存放的,因此我觉得可能需要读更多的数据块。
  1. SQL> select * from user_lobs where table_name='T2';

  2. TABLE_NAME                     COLUMN_NAME                                                                      SEGMENT_NAME                   TABLESPACE_NAME                INDEX_NAME                          CHUNK PCTVERSION  RETENTION  FREEPOOLS CACHE      LOGGING ENCRYPT COMPRESSION DEDUPLICATION   IN_ROW FORMAT          PARTITIONED SECUREFILE SEGMENT_CREATED RETENTION_TYPE RETENTION_VALUE
  3. ------------------------------ -------------------------------------------------------------------------------- ------------------------------ ------------------------------ ------------------------------ ---------- ---------- ---------- ---------- ---------- ------- ------- ----------- --------------- ------ --------------- ----------- ---------- --------------- -------------- ---------------
  4. T2                             NAME                                                                             SYS_LOB0000088496C00002$$      USERS                          SYS_IL0000088496C00002$$             8192                   900            NO         YES     NONE    NONE        NONE            YES    ENDIAN NEUTRAL  NO          NO         YES             YES            

复制代码
用to_char转换下,看看逻辑读:
  1. SQL> select id,to_char(name) from t2;

  2. 75351 rows selected.


  3. Execution Plan
  4. ----------------------------------------------------------
  5. Plan hash value: 1513984157

  6. --------------------------------------------------------------------------
  7. | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time         |
  8. --------------------------------------------------------------------------
  9. |   0 | SELECT STATEMENT  |         | 62603 |   120M|   273   (1)| 00:00:04 |
  10. |   1 |  TABLE ACCESS FULL| T2         | 62603 |   120M|   273   (1)| 00:00:04 |
  11. --------------------------------------------------------------------------

  12. Note
  13. -----
  14.    - dynamic sampling used for this statement (level=2)


  15. Statistics
  16. ----------------------------------------------------------
  17.           4  recursive calls
  18.           2  db block gets
  19.        6051  consistent gets
  20.           0  physical reads
  21.           0  redo size
  22.     3215696  bytes sent via SQL*Net to client
  23.       55777  bytes received via SQL*Net from client
  24.        5025  SQL*Net roundtrips to/from client
  25.           0  sorts (memory)
  26.           0  sorts (disk)
  27.       75351  rows processed
复制代码
可以看出to_char转换后逻辑读和t1表的逻辑读差不多,至于为什么会这样,我还要进一步摸索。
希望有大神给出更深入分析。

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-11-16 20:22 , Processed in 0.048993 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569