您可以在以下位置检查与 GTT 关联的临时段v$tempseg_usage
:
create global temporary table demo_gtt_preserve (id int) on commit preserve rows;
create global temporary table demo_gtt_delete (id int) on commit delete rows;
insert into demo_gtt_preserve values (1);
insert into demo_gtt_delete values (1);
select s.sql_text, tu.tablespace, tu.contents, tu.segtype, tu.segfile#, tu.segblk#
from v$tempseg_usage tu
join v$sql s on s.sql_id = tu.sql_id_tempseg
where tu.username = user
and tu.segtype = 'DATA'
and tu.session_num = dbms_debug_jdwp.current_session_serial;
结果:
SQL_TEXT TABLESPACE CONTENTS SEGTYP SEGFILE# SEGBLK#
---------------------------------------- ---------- --------- ------ -------- ----------
insert into demo_gtt_delete values (1) TEMP TEMPORARY DATA 401 438528
insert into demo_gtt_preserve values (1) TEMP TEMPORARY DATA 401 438400
现在,如果您提交并重新运行查询,您只会得到一行:
SQL_TEXT TABLESPACE CONTENTS SEGTYPE SEGFILE# SEGBLK#
---------------------------------------- ---------- --------- ------- -------- ---------
insert into demo_gtt_preserve values (1) TEMP TEMPORARY DATA 401 438400
(有点无益的是,通过andv$tempseg_usage
标识会话,它对应于and in ,两者都不是通过 暴露的。您可以通过加入和过滤来扩展上面的查询,或者如果您想将其限制为您自己的会话。)session_addr
session_num
saddr
serial#
v$session
sys_context
v$session
sid = sys_context('userenv','sid')
audsid = sys_context('userenv','sessionid')
清除剩余条目的唯一方法是断开会话,或者删除或截断表。
关于性能问题,请注意其工作方式:当您的会话使用 GTT 时,会为您创建一个全新的临时段。如果其他会话做同样的事情,他们每个人都会得到自己单独的临时段。当这些会话提交或断开连接时,相应的临时段将被删除。会话之间没有共享任何内容,因为每个会话都有自己单独的临时表实例。因此,如果我们不定期删除“保留”GTT,SQL 语句的性能会越来越慢的传言是没有道理的。