Oracle 12c - 查找是否设置了 TEMP_UNDO_ENABLED 之前创建的临时对象

Oracle 12c - Find if temporary objects created before TEMP_UNDO_ENABLED is set

数据库:Oracle 12c (12.1.0.2) - 带 RAC 的企业版

我正在尝试减少为我的应用程序生成的重做和存档日志,并使用 V$SYSSTAT 和使用 DBA_HIST* 视图的相应存档日志进行测量。

在我的数据库端应用程序代码中,我使用 TEMP_UNDO_ENABLED 的会话级别设置将 gtt 的 UNDO 定向到临时表空间。具体功能已注明 here

ALTER SESSION SET TEMP_UNDO_ENABLED = TRUE;
INSERT INTO my_gtt VALUES...

请注意文档中有此引用:

..if the session already has temporary objects using regular undo, setting this parameter will have no effect

如果我使用纯数据库会话,我可以确定由于在设置参数之前没有其他临时表 created/used,因此生成的 REDO 日志是最少的。我可以使用一个简单的 (select value from V$SYSSTAT where name= 'redo size') 来查看差异。

然而,实际应用程序 (Java) 通过 JDBC 会话触发此代码。因此,我无法确定在调用“ALTER SESSION..”之前会话中之前是否存在任何 GTT 或其他临时对象 created/used。这样做的结果是,如果说已经使用了 GTT,那么对“ALTER SESSION SET TEMP_UNDO_ENABLED = TRUE”的调用会在没有任何指示的情况下简单地忽略该设置。代码将继续在正常表空间中记录 UNDO 和 REDO,这是无意的。

是否有任何方法可以查询此参数 TEMP_UNDO_ENABLED 是否已在会话中 set/unset,以便在我执行 ALTER SESSION SET TEMP_UNDO_ENABLED = TRUE 之前我会确定这将或会不会有影响?

在此先感谢您的投入。

虽然这不能直接回答您的问题,但link可能会对您有所帮助。

在 12c 中添加了临时撤消概念

" Oracle 12c introduced the concept of Temporary Undo, allowing the undo for a GTT to be written to the temporary tablespace, thereby reducing undo and redo."

没有一种整体方法可以满足所有情况。发布我在其他地方得到的一些选项作为答案:

假设: 这两个选项仅在以下情况下有效:

  • 只关注GTT(不包括WITH等临时对象)
  • COMMIT/ROLLBACK 尚未完成,包括来自 SAVEPOINTS 或其他方法

选项 1:使用 v$tempseg_usage 来检查是否在 DATA 中创建了任何段,而不是 TEMP_UNDO

select count(*)
  from v$tempseg_usage
 where contents = 'TEMPORARY'
   and segtype = 'DATA'
   and session_addr =
       (select saddr
          from v$session
         where sid = sys_context('userenv', 'sid'));

选项 2:使用 gv$transaction 如下,ubafil = 0 if for temp_undo,否则 ubafil = undo tablespace file id:

select count(*)
  from gv$transaction
 where ses_addr = (select saddr
                     from v$session
                    where sid = sys_context('userenv', 'sid'))
   and ubafil <> 0;

关于其他的思考,我仍然认为,在 SESSION 的范围内,应该有一个参数或其他地方的指示只是表明 TEMP_UNDO_ENABLED 的设置没有效果,不必触及否则将被视为管理的视图。

如果有人找到更好的方法,我愿意回答。