metalink 给出的公式是
UR =undo_retention参数值
UPS = 每秒产生的undo block数量
DBS = undo tablespace block size
UR =undo_retention参数值
UPS = 每秒产生的undo block数量
DBS = undo tablespace block size
10g之前
SELECT (UR * (UPS * DBS)) AS "Bytes"
FROM (SELECT value AS UR FROM v$parameter WHERE name = 'undo_retention'),
(SELECT undoblks / ((end_time - begin_time) * 86400) AS UPS
FROM v$undostat
WHERE undoblks = (SELECT MAX(undoblks) FROM v$undostat)),
(SELECT block_size AS DBS
FROM dba_tablespaces
WHERE tablespace_name =
(SELECT UPPER(value)
FROM v$parameter
WHERE name = 'undo_tablespace'));
10g 以后
SELECT (UR * (UPS * DBS)) AS "Bytes"
FROM (select max(tuned_undoretention) AS UR from v$undostat),
(SELECT undoblks / ((end_time - begin_time) * 86400) AS UPS
FROM v$undostat
WHERE undoblks = (SELECT MAX(undoblks) FROM v$undostat)),
(SELECT block_size AS DBS
FROM dba_tablespaces
WHERE tablespace_name =
(SELECT UPPER(value)
FROM v$parameter
WHERE name = 'undo_tablespace'));
当然也可以用过DBMS_ADVISOR来获取Oracle关于undo的建议设置,当然不是每次都能获取到建议,相比还是上面提供的脚本比较方便。
下面语句来自于官方文档 稍微做了一点修改
其中123 124是snapshot的ID 需要根据实际做修改。
DECLARE
tid NUMBER;
tname VARCHAR2( 30);
oid NUMBER;
BEGIN
DBMS_ADVISOR.CREATE_TASK('Undo Advisor' , tid, tname, 'Undo Advisor Task' );
DBMS_ADVISOR.CREATE_OBJECT(tname, 'UNDO_TBS' , null, null, null, 'null', oid);
DBMS_ADVISOR.SET_TASK_PARAMETER(tname, 'TARGET_OBJECTS' , oid);
DBMS_ADVISOR.SET_TASK_PARAMETER(tname, 'START_SNAPSHOT' , 123);
DBMS_ADVISOR.SET_TASK_PARAMETER(tname, 'END_SNAPSHOT' , 124);
DBMS_ADVISOR.SET_TASK_PARAMETER(tname, 'INSTANCE' , 1);
DBMS_ADVISOR.execute_task(tname);
DBMS_OUTPUT.put_line( 'select * dba_advisor_log WHERE TASK_ID ='||tid || ' ;');
DBMS_OUTPUT.put_line( 'select * DBA_ADVISOR_FINDINGS WHERE TASK_ID ='||tid|| ' ;');
DBMS_OUTPUT.put_line( 'select * DBA_ADVISOR_RECOMMENDATIONS WHERE TASK_ID ='||tid||' ;');
END;
/