Как получить количество вставок / обновлений, происходящих в базе данных Oracle? - PullRequest
2 голосов
/ 15 июля 2011

Как получить общее количество вставок / обновлений, которые произошли в базе данных Oracle за определенный период времени?

1 Ответ

9 голосов
/ 15 июля 2011

Предполагая, что вы сконфигурировали 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
...