Предполагая, что вы сконфигурировали AWR для сохранения данных для всех операторов SQL (по умолчанию сохраняются только первые 30 по ЦП, прошедшему времени и т. Д., Если STATISTICS_LEVEL
равен 'TYPICAL', и первые 100, если STATISTICS_LEVEL
- это «ВСЕ» через что-то вроде
BEGIN
dbms_workload_repository.modify_snapshot_settings (
topnsql => 'MAXIMUM'
);
END;
и, предполагая, что операторы SQL не устаревают из кэша до того, как снимок их захватывает, вы можете использовать таблицы AWR для некоторых из них.
Вы можете узнать, сколько раз выполнялся оператор INSERT и сколько раз выполнялся оператор UPDATE
SELECT sum( stat.executions_delta ) insert_executions
FROM dba_hist_sqlstat stat
JOIN dba_hist_sqltext txt ON (stat.sql_id = txt.sql_id )
JOIN dba_hist_snapshot snap ON (stat.snap_id = snap.snap_id)
WHERE snap.begin_interval_time BETWEEN <<start time>> AND <<end time>>
AND txt.command_type = 2;
SELECT sum( stat.executions_delta ) update_executions
FROM dba_hist_sqlstat stat
JOIN dba_hist_sqltext txt ON (stat.sql_id = txt.sql_id )
JOIN dba_hist_snapshot snap ON (stat.snap_id = snap.snap_id)
WHERE snap.begin_interval_time BETWEEN <<start time>> AND <<end time>>
AND txt.command_type = 6;
Обратите внимание, что эти запросы включают как операторы, которые выдает ваше приложение, так и операторы, которые Oracle выдает в фоновом режиме. Вы можете добавить дополнительные критерии, если хотите отфильтровать определенные операторы SQL.
Аналогично, вы можете получить общее количество различных операторов INSERT и UPDATE
SELECT count( distinct stat.sql_id ) distinct_insert_stmts
FROM dba_hist_sqlstat stat
JOIN dba_hist_sqltext txt ON (stat.sql_id = txt.sql_id )
JOIN dba_hist_snapshot snap ON (stat.snap_id = snap.snap_id)
WHERE snap.begin_interval_time BETWEEN <<start time>> AND <<end time>>
AND txt.command_type = 2;
SELECT count( distinct stat.sql_id ) distinct_update_stmts
FROM dba_hist_sqlstat stat
JOIN dba_hist_sqltext txt ON (stat.sql_id = txt.sql_id )
JOIN dba_hist_snapshot snap ON (stat.snap_id = snap.snap_id)
WHERE snap.begin_interval_time BETWEEN <<start time>> AND <<end time>>
AND txt.command_type = 6;
Однако Oracle не отслеживает количество строк, которые были вставлены или обновлены в заданном интервале. Таким образом, вы не сможете получить эту информацию от AWR. Самое близкое, что вы могли бы получить, это попытаться использовать мониторинг, который использует Oracle, чтобы определить, устарела ли статистика. Предполагая, что MONITORING
включен для каждой таблицы (это по умолчанию в 11g, и я считаю, что это по умолчанию в 10g), т.е.
ALTER TABLE table_name
MONITORING;
Oracle будет периодически сбрасывать приблизительное число строк, которые вставляются, обновляются и удаляются для каждой таблицы в таблицу SYS.DBA_TAB_MODIFICATIONS
. Но это будет показывать только активность, так как статистика была собрана на столе, а не активность за определенный интервал. Однако вы можете попытаться написать процесс, который периодически записывает эти данные в вашу собственную таблицу, и сообщать об этом.
Если вы дадите команду Oracle сбросить информацию мониторинга из памяти на диск (в противном случае задержка может достигать нескольких часов)
BEGIN
dbms_stats.flush_database_monitoring_info;
END;
вы можете получить приблизительное количество строк, которые изменились в каждой таблице с момента последнего сбора статистики
SELECT table_owner,
table_name,
inserts,
updates,
deletes
FROM sys.dba_tab_modifications