查找字典查看用户上次查询的表

问题描述 投票:0回答:1

我需要字典,从中我可以看到用户在每个表上的上次查询时间。 我知道 sys.all_objects,它显示了最后一次 ddl 时间,我需要查看用户何时查询表。希望你能帮助我找到解决方案。预先感谢。

oracle database-administration
1个回答
0
投票

Oracle 不会按表或用户存储上次查询的日期。您需要启用选择审核来捕获此问题,但这可能会使用大量空间,并且在繁忙的数据库上很快就会变得难以管理。

但是,如果您可以接受低于 100% 的完美准确度,则可以使用 活动会话历史记录 (ASH) 数据(至少在您的保留允许的范围内)来近似您需要的数据。这样做的缺点是,该数据的磁盘版本仅存储每 10 个样本中的 1 个(每秒采样一次),因此如果查询运行时间少于 10 秒,则可能无法捕获该查询。这会丢失很多您可能需要的小东西,因此这可能是不可接受的:

SELECT /*+ USE_HASH(plan t ash u) PARALLEL(4) NO_MERGE(t) NO_MERGE(ash) NO_MERGE(u) */
       u.username,
       t.owner table_owner,
       t.table_name,
       MAX(ash.sample_time) last_access_time
  FROM (SELECT /*+ NO_MERGE */ sql_id,plan_hash_value,object_name,object_owner
          FROM dba_hist_sql_plan
         WHERE object_name IS NOT NULL
           AND object_type = 'TABLE'
         GROUP BY sql_id,plan_hash_value,object_name,object_owner) plan,
       dba_tables t,
       dba_hist_active_sess_history ash,
       dba_users u
 WHERE plan.object_owner = t.owner
   AND plan.object_name = t.table_name
   AND plan.sql_id = ash.sql_id
   AND plan.plan_hash_value = ash.sql_plan_hash_value
   AND ash.user_id = u.user_id
 GROUP BY u.username,
          t.owner,
          t.table_name

解决十分之一问题的一个选择是让作业每半小时左右运行一次,并从 ASH 的内存版本中捕获此信息,该信息的粒度为 1 秒,因此错过东西的可能性要小得多(它仍然会错过一些亚秒级的活动):

SELECT /*+ USE_HASH(plan t ash u) PARALLEL(4) NO_MERGE(t) NO_MERGE(ash) NO_MERGE(u) */
       u.username,
       t.owner table_owner,
       t.table_name,
       MAX(ash.sample_time) last_access_time
  FROM (SELECT /*+ NO_MERGE */ sql_id,plan_hash_value,object_name,object_owner
          FROM gv$sql_plan
         WHERE object_name IS NOT NULL
           AND object_type = 'TABLE'
         GROUP BY sql_id,plan_hash_value,object_name,object_owner) plan,
       dba_tables t,
       gv$active_session_history ash,
       dba_users u
 WHERE plan.object_owner = t.owner
   AND plan.object_name = t.table_name
   AND plan.sql_id = ash.sql_id
   AND plan.plan_hash_value = ash.sql_plan_hash_value
   AND ash.user_id = u.user_id
 GROUP BY u.username,
          t.owner,
          t.table_name          

然后将其记录到表中,并在每次运行时不断合并/更新每个键的最新

last_access_time
结果。再说一次,如果您需要完美的准确性,您将需要使用 Oracle 的审计功能,但您可能会发现它使用了太多空间。这是一个轻量级选项,不太准确,但考虑到您的情况可能会满足您的需求。

© www.soinside.com 2019 - 2024. All rights reserved.