根据LOB对象的处理机制,在LOB对象的操作过程中,Oracle会生成临时的LOB数据,这部分数据也会适用临时段,这也是一个产品数据库中经常可以观察到的临时段使用方式。如果在并发很高的环境中,此类的LOB操作可能会导致数据库的TEMP表空间的不足。所以这也是DBA需要注意的一个地方。
通过以下一小段代码我们可以很容易的再现这类问题:
declare A CLOB; BEGIN A := 'ABC'; DBMS_LOCK.SLEEP(120); END; /
在一个Session中执行这段代码,在另外Session中查询,可以得到当前临时段的使用情况:
SQL> SELECT s.username, s.SID, u.TABLESPACE, u.CONTENTS, u.segtype, 2 ROUND (u.blocks * 8192 / 1024 / 1024, 2) mb 3 FROM v$session s, v$tempseg_usage u 4 WHERE s.saddr = u.session_addr AND u.CONTENTS = 'TEMPORARY' 5 ORDER BY mb DESC; USERNAME SID TABLESPACE CONTENTS SEGTYPE MB ---------- ---------- ---------- --------- --------- ---------- SYS 11 TEMP TEMPORARY LOB_DATA 1
这个临时空间使用需要等到Session退出后才会释放,那么在并发很高的情况下,这一空间使用就将值得关注。
在SQL执行过程中,我们可以通过之前提到的SQL来获取这些引发临时空间使用的SQL语句:
SQL> SELECT /*+ rule */ 2 DISTINCT a.SID, a.process, a.serial#, 3 TO_CHAR (a.logon_time, 'YYYYMMDD HH24:MI:SS') LOGON, a.osuser, 4 TABLESPACE, b.sql_text 5 FROM v$session a, v$sql b, v$sort_usage c 6 WHERE a.sql_address = b.address AND a.saddr = c.session_addr 7 / SID PROCESS SERIAL# LOGON OSUSER TABLESPACE ---- ------------ ---------- ----------------- -------- ---------- SQL_TEXT -------------------------------------------------- 136 15785 10850 20070410 10:58:19 oracle TEMP declare A CLOB; BEGIN A := 'ABC'; DBMS_LOCK. SLEEP(120); END;
以下是我的一个Oracle9i生产环境中的数据,我们看到这种情况在现实应用中是非常常见的:
SQL> SELECT s.username, s.SID, u.TABLESPACE, u.CONTENTS, u.segtype, 2 ROUND (u.blocks * 8192 / 1024 / 1024, 2) mb 3 FROM v$session s, v$tempseg_usage u 4 WHERE s.saddr = u.session_addr AND u.CONTENTS = 'TEMPORARY' 5 ORDER BY mb DESC; USERNAME SID TABLESPACE CONTENTS SEGTYPE MB -------------------- ---------- ---------- --------- --------- ---------- GENCOMMU 204 TEMP TEMPORARY LOB_DATA 1 GENCOMMU 376 TEMP TEMPORARY LOB_DATA
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。