…a customer needed a quick way for enabling index monitoring for a whole schema:
don’t know what index monitoring is? check the documentation
example calls:
@index_monitoring_bulk USER ON Y @index_monitoring_bulk USER OFF Y
Script:
/** enable index monitoring for a given user parameters: user, on/off, debug e.g. @index_monitoring_bulk USER ON Y **/ SET SERVEROUT ON SET LINES 164 SET VERIFY OFF SET FEEDBACK OFF CLEAR COLUMNS VARIABLE for_user CHAR(30) VARIABLE on_off CHAR(3) VARIABLE debug_on CHAR(1) BEGIN :for_user := '&1'; :on_off := '&2'; :debug_on := '&3'; END; / DECLARE lcb_debug CONSTANT BOOLEAN := :debug_on = 'Y'; lcv_user CONSTANT all_users.username%TYPE := UPPER ( REPLACE ( :for_user, ' ','' ) ); lcv_on_off CONSTANT VARCHAR2(3) := NVL ( REPLACE ( :on_off, ' ', '' ), 'OFF' ); TYPE tab_index_names IS TABLE OF all_indexes.index_name%TYPE INDEX BY PLS_INTEGER; ltab_index_names tab_index_names; lv_statement VARCHAR2(2000); lv_monitoring_clause VARCHAR2(12); le_iot EXCEPTION; le_resouce_busy EXCEPTION; PRAGMA EXCEPTION_INIT(le_iot, -25176); PRAGMA EXCEPTION_INIT(le_resouce_busy, -00054); PROCEDURE debug ( pv_text IN VARCHAR2 ) IS BEGIN IF ( lcb_debug ) THEN dbms_output.put_line ( pv_text ); END IF; END debug; FUNCTION user_exists ( pv_user IN all_users.username%TYPE ) RETURN BOOLEAN IS CURSOR cur_check_user IS SELECT 'does_exist' FROM all_users WHERE username = pv_user ; lv_cursor_result VARCHAR2(10); BEGIN debug ( ' Checking database for user: '|| lcv_user ); OPEN cur_check_user; FETCH cur_check_user INTO lv_cursor_result; CLOSE cur_check_user; RETURN lv_cursor_result IS NOT NULL; END user_exists; PROCEDURE get_indexes_for_user ( pv_user IN all_users.username%TYPE ) IS CURSOR cur_get_indexes_for_user IS SELECT index_name FROM all_indexes WHERE owner = pv_user ; BEGIN OPEN cur_get_indexes_for_user; FETCH cur_get_indexes_for_user BULK COLLECT INTO ltab_index_names; CLOSE cur_get_indexes_for_user; END get_indexes_for_user; BEGIN IF user_exists ( pv_user => lcv_user ) THEN IF lcv_on_off IN ('ON','OFF') THEN debug ( ' User: '||lcv_user||' does exist '); debug ( ' ON/OFF flag is: '||lcv_on_off ); debug ( ' Loading indexes ' ); get_indexes_for_user ( pv_user => lcv_user ); IF ( lcv_on_off = 'ON' ) THEN lv_monitoring_clause := 'MONITORING'; ELSE lv_monitoring_clause := 'NOMONITORING'; END IF; IF ltab_index_names IS NOT NULL AND ltab_index_names.COUNT > 0 THEN FOR i IN ltab_index_names.FIRST..ltab_index_names.LAST LOOP debug ( ' Processing index: '||lcv_user||'.'||ltab_index_names(i) ); lv_statement := 'ALTER INDEX "'||lcv_user||'"."'||ltab_index_names(i)||'" '||lv_monitoring_clause||' USAGE'; debug ( ' Statement is: '||lv_statement ); BEGIN EXECUTE IMMEDIATE lv_statement; EXCEPTION WHEN le_iot THEN debug ( ' --- Index monitoring not possible on IOTs, skipping' ); WHEN le_resouce_busy THEN debug ( ' --- Resource busy, propably SYS_ indexes ' ); END; END LOOP; END IF; ELSE dbms_output.put_line ( ' ON/OFF flag must be ON or OFF ' ); END IF; ELSE dbms_output.put_line ( ' User '||lcv_user|| ' does not exist ! '); END IF; END; /
After your usual workload check the results in v$object_usage:
SQL> desc v$object_usage; Name Null? Type ----------------------------------------- -------- ---------------------------- INDEX_NAME NOT NULL VARCHAR2(30) TABLE_NAME NOT NULL VARCHAR2(30) MONITORING VARCHAR2(3) USED VARCHAR2(3) START_MONITORING VARCHAR2(19) END_MONITORING VARCHAR2(19) SQL>