【问题标题】:Is there a way to in Oracle to see what tables have data and which don't?有没有办法在 Oracle 中查看哪些表有数据,哪些没有?
【发布时间】:2015-10-19 17:40:46
【问题描述】:

我想知道是否有一种方法可以搜索数据库并找出哪些表是空的,哪些表有数据。我会将一些数据迁移到另一个系统,很高兴知道我应该导出哪些表。我正在使用 Oracle SQL Developer。

【问题讨论】:

  • 选择计数应该为您提供表中的记录数。
  • 不管有没有数据都导出所有表有什么坏处?
  • 如果包含where rownum = 1,如果表有数据,则返回 1,如果没有,则返回 0,并且在整个表上运行速度比 select count(*) 快。

标签: sql oracle oracle-sqldeveloper


【解决方案1】:

除了为每个表运行一个愚蠢的 pl/sql 块到count(*) 之外,一种方法是运行这个:

SELECT num_rows FROM ALL_TAB_STATISTICS WHERE OWNER = 'user name';

(备用表:DBA_TAB_STATISTICSUSER_TAB_STATISTICS

但是,它仅在您最近使用 DBMS_STATS 包收集统计信息时才有效。

【讨论】:

  • 就是这样!非常感谢 Sebas,这帮助很大。我能够从 Oracle Developer 那里获得一个不错的列表并导出到 excel 以查看表名。
【解决方案2】:

是的,您可以使用如下查询为数据库中的所有表选择计数

select table_name,
to_number(
   extractvalue(
      xmltype(
         dbms_xmlgen.getxml('select count(*) c from '||table_name))
,'/ROWSET/ROW/C')) count
from user_tables;

这是demo

【讨论】:

    【解决方案3】:

    Accepted 答案不正确,因为需要在最后一次修改表之后收集统计信息,以保证查询将产生正确的结果。

    Shreyas Chavan 的答案是正确的,但性能可能很差。以下查询给出了准确的答案,但在有很多表的情况下应该表现更好。

    select owner, table_name,
    case
    to_number(
       extractvalue(
          xmltype(
             dbms_xmlgen.getxml('select count(1) c 
                                 from '||owner||'.'||table_name||' 
                                 where rownum<2'))
    ,'/ROWSET/ROW/C')) 
    when 1 then 'Y' else 'N' END has_data
    from all_tables 
    ORDER BY owner, table_name;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多