0

有人可以就 Oracle GTT 的两种不同设置背后的机制提供建议吗?

1) 在提交时保留行

2) 在提交时删除行

现在我知道“事实”:

a) 插入这两种 GTT 的记录具有不同的生命周期。

b) 两种类型的 GTT 的定义保持不变,直到我们删除 GTT < REF >。

但是,我想知道的是,就事实 b) 而言,两种类型的 GTT 之间是否有任何区别?

有人告诉我,对于“保留”类型的 GTT,表的定义不仅会保留,而且会按使用次数累积(即,如果有 10 个会话使用 GTT,则会创建表定义的 10 个副本,并且在我们放弃 GTT 之前不会消失)。而且如果我们不定期删除'preserve' GTT,SQL 语句的性能会越来越慢。

请问有人能解惑吗?

【2018.08.21】 感谢大家回答问题。请允许我细化这个问题,不是 GTT 的表定义被复制,而是每个会话使用相同的 GTT 分配的表空间在会话结束时不会释放,而是 GTT 的专用删除。那会是事实吗?

4

1 回答 1

3

您可以在以下位置检查与 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_addrsession_numsaddrserial#v$sessionsys_contextv$sessionsid = sys_context('userenv','sid')audsid = sys_context('userenv','sessionid')

清除剩余条目的唯一方法是断开会话,或者删除或截断表。

关于性能问题,请注意其工作方式:当您的会话使用 GTT 时,会为您创建一个全新的临时段。如果其他会话做同样的事情,他们每个人都会得到自己单独的临时段。当这些会话提交或断开连接时,相应的临时段将被删除。会话之间没有共享任何内容,因为每个会话都有自己单独的临时表实例。因此,如果我们不定期删除“保留”GTT,SQL 语句的性能会越来越慢的传言是没有道理的。

于 2018-08-21T11:43:51.493 回答