可以通过提交下面的查询来计算数据库中实际产生的撤销数据:
sys@ORCL> select sum(d.bytes) "undo" 2 from v$datafile d, v$tablespace t, dba_tablespaces s 3 where s.contents = 'UNDO' 4 and s.status = 'ONLINE' 5 and t.name = s.tablespace_name 6 and d.ts# = t.ts#; undo ---------- 1048576000
sys@ORCL> select max(undoblks / ((end_time - begin_time) * 3600 * 24)) "UNDO_BLOCK_PER_SEC" 2 FROM v$undostat; UNDO_BLOCK_PER_SEC ------------------ .109816972 --因为这里是我的测试数据库。
sys@ORCL> show parameter db_block_size NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_block_size integer 8192
sys@ORCL> select 1048576000/(0.495726495726496*8192) from dual; 1048576000/(0.495726495726496*8192) ----------------------------------- 258206.897
v$undostat视图包含了数据库如何来使用撤销空间的统计信息,以及运行时间最长的查询等信息。可以使用这些信息计算当前数据库所处理的工作负载的撤销空间大小。v$undostat视图中每一行显示十分钟时间间隔的撤销统计信息。表中最多包含576行数据,每一行记录十分钟。因此,最多可以查看四天内的撤销空间使用情况。
BEGIN_TIME:时间段的起始时间。
END_TIME:时间段的截止时间。
UNDOBLKS:在十分钟的间隔内数据库所消耗的撤销数据块数量。
TXNCOUNT:在十分钟时间间隔内所执行的事务数。
MAXQUERYLEN:显示了在十分钟间隔内该实例上执行的,耗时最长的查询所花的时间(单位为秒)。
MAXQUERYID:时间间隔内运行时间最长的SQL语句的标识符。
NOSPACEERRCNT:数据库在撤销表空间中,因为整个空间都被活动事务所占用,因而没有足够空间来存放新撤销数据的次数。
TUNED_UNDORETENTION:数据库在提交撤销所属事务后,将会保留撤销数据的时长,单位为秒。
sys@ORCL> select to_char(begin_time, 'hh24:mi:ss') BEGIN_TIME, 2 to_char(end_time, 'hh24:mi:ss') END_TIME, 3 maxquerylen, 4 nospaceerrcnt, 5 tuned_undoretention 6 from v$undostat; BEGIN_TI END_TIME MAXQUERYLEN NOSPACEERRCNT TUNED_UNDORETENTION -------- -------- ----------- ------------- ------------------- 17:37:31 17:43:00 1281 0 2062 17:27:31 17:37:31 978 0 1759 17:17:31 17:27:31 372 0 1153 17:07:31 17:17:31 974 0 1755 16:57:31 17:07:31 368 0 1151 16:47:31 16:57:31 968 0 1809 16:37:31 16:47:31 363 0 1205 16:27:31 16:37:31 961 0 1805 16:17:31 16:27:31 358 0 1200 16:07:31 16:17:31 957 0 1799 15:57:31 16:07:31 353 0 1195 15:47:31 15:57:31 953 0 1794 15:37:31 15:47:31 349 0 1190 15:27:31 15:37:31 948 0 1790 15:17:31 15:27:31 342 0 1185 已选择15行。oracle在一个给定的时间段,会根据执行时间最长的查询来提高或降低撤销保留时间。