如何找出哪些列在Oracle 12c中访问最多或使用最频繁

如何找出哪些列在Oracle 12c中访问最多或使用最频繁,oracle,oracle12c,database-performance,usage-statistics,database-tuning,Oracle,Oracle12c,Database Performance,Usage Statistics,Database Tuning,我正在处理一个有618列的大表。团队不想开始研究哪些列没有被使用,并修改代码以删除它们,我理解时间限制。一个建议是确定该表中哪些列是访问次数最多或使用频率最高的,并更改列的顺序。我把tunning留给了专家,我被指派去识别这样的专栏 因此,我查询了所有的tab列,试图找出一种简单的方法来完成任务。四列引起了我的注意:Num_distinct、Density、Num_nulls、Sample_size。我认为sample_size和num_nulls之间的比率可以用来标识最常用的列。该比率与1最接

我正在处理一个有618列的大表。团队不想开始研究哪些列没有被使用,并修改代码以删除它们,我理解时间限制。一个建议是确定该表中哪些列是访问次数最多或使用频率最高的,并更改列的顺序。我把tunning留给了专家,我被指派去识别这样的专栏

因此,我查询了所有的tab列,试图找出一种简单的方法来完成任务。四列引起了我的注意:Num_distinct、Density、Num_nulls、Sample_size。我认为sample_size和num_nulls之间的比率可以用来标识最常用的列。该比率与1最接近,被使用的概率就越高。但和往常一样,这不可能那么容易,因为我发现我得到了疯狂的比率,因为我在8000万ish中有NUM-NULLS中的列,并且样本大小只有141

我想知道是否有人有过类似的情况,或者是否有人建议最好的解决方法。先谢谢你

我执行了下面的查询,并根据统计数据生成了一个列列表。至少这样,我知道我需要交付什么

选择ts.owner、ts.table\u name、ts.column\u name、tc.column\u id、t.num\u rows、ts.num\u nulls、, 案例 当nvlts.num_为空时,0>0,然后1-roundts.num_为空/t.num_行,6 当nvlts.num_为空时,0=0然后为1 最终用途PERC, ts.num_distinct,ts.density 从所有表格中 在ts.owner=t.owner和ts.table\u name=t.table\u name上加入所有的\u选项卡\u列\u统计信息ts 在tc.owner=ts.owner和tc.table\u name=ts.table\u name和tc.column\u name=ts.column\u name上连接所有的\u选项卡\u列 其中t.owner='THE_owner' 和t.table_name='THE_mage_table'
order by ts.num_nulls,ts.density desc

查看列使用频率的最佳方法是启用细粒度审核并让它运行一段时间。然后查看捕获的语句:

grant create session, unlimited tablespace 
  to u 
  identified by u;

create table u.t (
  c1 int, c2 int, c3 int
);

exec dbms_fga.add_policy ( 'U', 'T', 'AUDIT_COLS', enable => true, statement_types => 'INSERT,UPDATE,DELETE,SELECT' );

conn u/u

insert into t ( c1 ) values ( 1 );
insert into t values ( 2, 2, 2 );

select c2 from t;
select * from t;

update t
set    c3 = 1
where  c1 = 1;

delete t
where  c2 is null;
commit;

conn chris

select sql_text 
from   dba_fga_audit_trail;

SQL_TEXT                               
insert into t ( c1 ) values ( 1 )       
insert into t values ( 2, 2, 2 )        
select c2 from t                        
select * from t                         
update t
set    c3 = 1
where  c1 = 1    
delete t
where  c2 is null  

注意:您得到了完整的语句,因此需要进行一些争论来提取列。

查看列使用频率的最佳方法是启用细粒度审核并让它运行一段时间。然后查看捕获的语句:

grant create session, unlimited tablespace 
  to u 
  identified by u;

create table u.t (
  c1 int, c2 int, c3 int
);

exec dbms_fga.add_policy ( 'U', 'T', 'AUDIT_COLS', enable => true, statement_types => 'INSERT,UPDATE,DELETE,SELECT' );

conn u/u

insert into t ( c1 ) values ( 1 );
insert into t values ( 2, 2, 2 );

select c2 from t;
select * from t;

update t
set    c3 = 1
where  c1 = 1;

delete t
where  c2 is null;
commit;

conn chris

select sql_text 
from   dba_fga_audit_trail;

SQL_TEXT                               
insert into t ( c1 ) values ( 1 )       
insert into t values ( 2, 2, 2 )        
select c2 from t                        
select * from t                         
update t
set    c3 = 1
where  c1 = 1    
delete t
where  c2 is null  

请注意,您得到了完整的语句,因此需要进行一些争论以提取列。

这将非常困难。您可以查询v$sqlarea,它显示最近执行的查询,包括执行的时间和sql文本。使用user_tab_列中的结果搜索有问题的表。请注意,v$sqlarea是暂时的,其中的数据将一直更改。顺便说一句,拥有一个618列的表听起来像是一个巨大的设计缺陷。祝你好运我将尝试不同的方法并展示我所拥有的。我会查一下你的,看看能得到什么。拥有一张618列的桌子听起来像是一个巨大的设计缺陷相信我,我告诉他们,但显然,太晚了,非常感谢!您希望查找查询中比其他列更常用的列,并修改表,以便在选择时将这些行放在第一位?这是一个奇怪的想法,我不认为你会从中得到任何好处。你到底想得到什么?我甚至不明白你的目的。你观察到的问题是什么?这是一个抽象的解析时间吗?同意其他人的观点,重新排序列不一定会对你有任何帮助;删除过时的COL将减少完整扫描的i/o。“所有”选项卡“列中的信息都会告诉您有关列中数据的度量,但它无法告诉您该数据的使用方式,或应用程序使用该数据的频率。此外,识别用于检查SQL的列也不能保证准确-您无法知道是否捕获了所有可能的SQL语句。唯一可以确定的方法是浏览应用程序源代码;其他任何事情都只是猜测。这将是很难做到的。您可以查询v$sqlarea,它显示最近执行的查询,包括执行的时间和sql文本。使用user_tab_列中的结果搜索有问题的表。请注意,v$sqlarea是暂时的,其中的数据将一直更改。顺便说一句,拥有一个618列的表听起来像是一个巨大的设计缺陷。祝你好运我将尝试不同的方法并展示我所拥有的。我会查一下你的,看看能得到什么。拥有一张618列的桌子听起来像是一个巨大的设计缺陷相信我,我告诉他们,但显然,太晚了,非常感谢!您希望查找查询中比其他列更常用的列,并修改表,以便在选择时将这些行放在第一位?这是一个奇怪的想法,我不认为你会从中得到任何好处。你到底想得到什么?我甚至不明白目的。有什么问题吗
你在观察吗?这是一个抽象的解析时间吗?同意其他人的观点,重新排序列不一定会对你有任何帮助;删除过时的COL将减少完整扫描的i/o。“所有”选项卡“列中的信息都会告诉您有关列中数据的度量,但它无法告诉您该数据的使用方式,或应用程序使用该数据的频率。此外,识别用于检查SQL的列也不能保证准确-您无法知道是否捕获了所有可能的SQL语句。唯一可以确定的方法是浏览应用程序源代码;其他一切都只是猜测。谢谢,我会和团队核实。谢谢,我会和团队核实。