DECLARE
var_start_redo integer;
var_end_redo integer;
BEGIN
SELECT ss.value
INTO var_start_redo
FROM v$sesstat ss,
v$statname sn
WHERE ss.statistic# = sn.statistic#
AND sn.name = 'redo size'
AND ss.sid = SYS_CONTEXT('USERENV','SID');
// DO STUFF
SELECT ss.value
INTO var_end_redo
FROM v$sesstat ss,
v$statname sn
WHERE ss.statistic# = sn.statistic#
AND sn.name = 'redo size'
AND ss.sid = SYS_CONTEXT('USERENV','SID');
dbms_output.put_line(TO_CHAR(var_end_redo - var_start_redo)|| ' redo bytes generated');
END;
1条答案
按热度按时间u5rb5r591#
只要您没有使用任何并行DML(PDML),您就可以在活动之前利用
v$sesstat
获取会话的redo size
计数器,然后在活动之后再次查询它以获取计数器,差异在于流程生成的重做量。只要您有一个归档日志dest,那么它就是您在生产中预期消耗的归档日志空间。如果这很重要的话,可以通过除以重做日志文件大小(
v$log.bytes
)来计算将产生的归档日志的数量。如果你 * 正在 * 使用并行DML,这就困难得多了,因为你需要的会话信息只在每个PX从站的生命周期内可用,而这个生命周期在DML操作结束时结束,所以你不能同步地做“之前和之后”的事情。获取这些数字的唯一方法是让应用程序外部的监视器进程频繁轮询(例如:每秒)的
v$sesstat
上的SID
s(如果是RAC,则INST_ID
来自gv$sesstat
),您可以通过在QC字段上连接gv$px_session
和gv$session
来获得。这里的目标是在会话结束之前获得重做计数器的最大值(或接近最大值),这将是仍然找到数据的最后一个轮询事件。但是,禁用并行DML可能要容易得多,这样您就不必做所有这些,因为重做的数量在有和没有并行DML的情况下不会有明显的不同。或者,* 如果 * 开发系统是安静的,并且 * 没有其他 * 正在发生,您可以假设您的块更改是唯一发生的,只需通过将
v$sysstat
替换为v$sesstat
来使用系统级计数器。这将涵盖PX slave在并行DML模式下所做的任何事情,并且也不需要您检测代码本身。