查找Oracle中给定时间段内未使用的所有表

时间:2017-12-13 05:09:48

标签: sql oracle oracle11g

尝试查找一个SQL查询,该查询可以列出oracle中给定时间段内未使用的所有表。

以下查询返回所有者的所有表格:

select tablespace_name, table_name
from ALL_TABLES
where owner ='HP';

我执行以下查询以获取有关表读和写的一些统计信息,遗憾的是它返回未找到的错误表:

SELECT *
FROM v$segment_statistics
WHERE owner = 'HP';

我有什么方法可以根据范围包含日期因子过滤表吗?

2 个答案:

答案 0 :(得分:1)

“所有在给定时间内未使用的表格”是指任何用法?请记住,有直接用法:SELECT,INSERT,UPDATE,DELETE。还有间接使用,例如外键的强制执行。间接使用会很困难。另外请记住,某些对象可能只是季节性使用(例如,如果您的应用程序具有商业周期,例如季度报告或年终报告)。

所以这是一个审计问题。您可以使用Oracle的标准AUDIT功能找到此信息。默认情况下不会打开它,因为记录DML活动会产生开销。如果为所有表启用SELECT,则每次对表发出SELECT时记录的开销都很明显。所以要小心使用它。

AUDIT SELECT TABLE, UPDATE TABLE, INSERT TABLE, DELETE TABLE; 

Find out more

审核将记录每次在桌面上发生DML操作时的记录。这显然是您需要的更多信息。但那是有的。

您提到使用v$segment_statistics的可能性。这是动态性能视图之一,默认情况下不会授予常规用户,但会询问您的DBA。如您所知,它只是一个统计的运行计数,没有日期或时间戳列。如果您的组织授权Diagnostic pack,您会在AWR视图DBA_HIST_SEG_STATS中找到这些统计信息的历史记录。

如果你有AWR正在工作,利用这些数据来跟踪正在使用的表是一件简单的事情。但是,如果您没有必要的许可证,则必须保留自己v$segment_statistics的历史记录,并自行检查增量。这只需要是从后台作业运行的每日任务。

这一切看起来都非常复杂,因为它应该是一项简单的任务。 Oracle似乎认为我们应该很好地理解模式中的所有表。但根据我的经验,开发人员更愿意创建表,然后他们就放弃它们。因此,遗留系统存在粗略的模式,并且没有简单的方法来进行影响分析,因为在外部DAO设计中嵌入了太多的SQL。

答案 1 :(得分:0)

此问题通常需要对v $ segment_statistics中的信息进行一些快照,除非广泛的审计是可行的,而繁忙的数据库通常不是这种情况。特别是,检查“逻辑读取”和“数据块更改”统计信息的更改,以查看对表的读取和/或写入的证据。但是,统计信息收集可能会抛弃此方法以排除应用程序读取,除非dbms_stats与“GATHER AUTO”或“GATHER STALE”的OPTIONS一起使用(因为stats集合将生成逻辑读取。)这些选项仅收集有关这些表的统计信息。自上次统计信息收集以来发生了大量更改,因此未获取插入,更新或删除的表将永远不会收集统计信息。 (这假设statistics_level参数至少设置为'typical',这是默认值。)

Oracle 11g中的默认统计信息收集作业使用'GATHER AUTO',如文档here所示。您可以确认这是否与以下查询一起使用:

SQL> select client_name, status from dba_autotask_client;

CLIENT_NAME                          STATUS
------------------------------------ --------
auto optimizer stats collection      ENABLED
auto space advisor                   ENABLED
sql tuning advisor                   ENABLED

如果发生默认统计信息收集并且未发生所有表的手动统计信息收集,则可以从检查last_analyze时间开始:

select table_name, last_analyzed from all_tables
where owner = 'HR' order by last_analyzed;

怀疑未使用的表可能是last_analyzed值较旧的表。如果只关注写入,可以检查all_tab_modifications:

select table_name, inserts+updates+deletes as change_count, timestamp
from all_tab_modifications where table_owner = 'HR';

如果需要检查读取,则AWR(需要Diagnostic Pack许可证)在dba_hist_seg_stat视图中包含段信息的快照。如果没有Diagnostic Pack,Statspack可以将统计信息填充到统计级别为7或更高级别的统计信息$ seg_stat中。 (More on Statspack levels。)但是,这两个都可以证明正在使用表 但不使用表。原因是两个工具只选择有限数量的“顶部”段。

要获得明确的答案,您可能需要制作自己的信息快照。一个非常简单的方法可以从创建这样的表开始:

create table my_segstat as select sysdate as snap_date,
  object_name, object_type, statistic_name, value
from v$segment_statistics
where owner = 'HR' 
  and statistic_name in ('logical reads', 'db block changes') ;

然后设置一个作业,定期使用如下查询添加信息的快照:

insert into my_segstat as select sysdate as snap_date,
  object_name, object_type, statistic_name, value
from v$segment_statistics
where owner = 'HR' 
  and statistic_name in ('logical reads', 'db block changes') ;

稍后,可以根据以下查询对数据进行分析:

select snap_date, object_name, statistic_name,
  value - lag(value) over (partition by object_name, statistic_name
                           order by snap_date) as delta
from my_segstat;

当然,可能有其他东西读或写应该是“未使用”的表格,也可能会抛弃这种分析方法。