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'));
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; /