Oracle-仅选择包含数据的列
我们有一个由第三方建立的包含大量表和列的数据库 其中许多列完全没有使用。我试图创建一个查询,返回实际使用的所有列的列表(包含>0个值) 我目前的尝试-Oracle-仅选择包含数据的列,oracle,oracle11g,Oracle,Oracle11g,我们有一个由第三方建立的包含大量表和列的数据库 其中许多列完全没有使用。我试图创建一个查询,返回实际使用的所有列的列表(包含>0个值) 我目前的尝试- SELECT table_name, column_name FROM ALL_TAB_COLUMNS WHERE OWNER = 'XUSER' AND num_nulls < 1 ; 选择表名、列名 从所有_选项卡_列 其中所有者='XUSER' 和num_nulls
SELECT table_name, column_name
FROM ALL_TAB_COLUMNS
WHERE OWNER = 'XUSER'
AND num_nulls < 1
;
选择表名、列名
从所有_选项卡_列
其中所有者='XUSER'
和num_nulls<1
;
如预期的那样,使用num_nulls<1
可以显著减少返回值的数量
但是,在检查某些表时,查询结果中缺少一些列,这些列中似乎有值
有人能解释为什么会这样吗 首先,统计数据并非总是100%准确。它们可以收集在表行的子集上,因为它们毕竟是统计数据。正如民意调查者不必询问每个美国人对某位政治家的感受一样,甲骨文公司只需读取表格中的一部分数据,就可以对表格中的数据做出足够准确的判断 即使统计数据是在表中100%的行上收集的(如果您愿意,也可以通过这种方式收集),一旦表中有任何插入、更新或删除,统计数据也将过时 其次,
num_nulls<1
不会告诉您没有数据的列。假设一个表有100行,“X列”的num_nulls
等于80。这意味着该列有20个非空值,但不会通过过滤器。更好的方法(如果您相信您的统计数据没有过时,并且基于100%的行样本),可能是比较DBA\u TAB\u COLUMNS.NUM\u NULLS
。例如,一个100行表中有99个空值的列在一行中有数据
“查询结果中缺少一些列,这些列中似乎有值。”
可能每个非强制列都会出现在该集中,因为某些行可能有值,但不是所有行。“某些行”大于零意味着此类列无法通过num_nulls<1
的测试
因此,也许您应该搜索未使用的列。此查询将查找每行为空的列:
select t.table_name
, tc.column_name
from user_tables t
join user_tab_cols tc on t.table_name = tc.table_name
where t.num_rows > 0
and t.num_rows = tc.num_nulls;
请注意,如果使用分区,则需要扫描user\u tab\u partitions.num\u rows
和user\u part\u col\u statistics.num\u nulls
此外,我赞同其他人就统计数字提出的建议。上面的查询可能会抛出一些误报。我将把该查询产生的结果视为有待进一步调查的候选人名单。例如,您可以生成计算每列的实际空值数的查询。这些列是在收集统计信息时设置的。尝试使用analyze语句或dbms_stats包运行gather stats