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 的设置没有效果,不必触及否则将被视为管理的视图。
如果有人找到更好的方法,我愿意回答。
数据库: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 的设置没有效果,不必触及否则将被视为管理的视图。
如果有人找到更好的方法,我愿意回答。