Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle-仅选择包含数据的列_Oracle_Oracle11g - Fatal编程技术网

Oracle-仅选择包含数据的列

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

我们有一个由第三方建立的包含大量表和列的数据库

其中许多列完全没有使用。我试图创建一个查询,返回实际使用的所有列的列表(包含>0个值)

我目前的尝试-

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