求一句sql,我想看到a114用户下的所有数据量>100万的表的信息,如何搞呢?

解决方案 »

  1.   

      select * from user_all_tables a
      where a.num_rows>1000000
      

  2.   

    这段sql能用的前提是a114用户下所有表的统计信息都是最新的。
    保险的办法是所有表都count一遍:
    select 'select '||''''||table_name ||''','||'count(*) from '||table_name ||' union all' 
    from user_all_tables ;
    把上面这段sql的执行结果拷贝出来,把最后面一行的union all去掉再执行即可
      

  3.   

    要先统计schema以后,num_rows才能有比较准的信息,最准备的方式通过proecudre,把所有的表都遍历的select count一把。
      

  4.   

    declare
      aa number(10);
      bb varchar2(400);
      cursor cc is select table_name from dba_tables where owner='A114';
    begin 
      for nn in cc loop
      bb:='select count(*) from a114.'||nn.table_name;
      execute immediate bb into aa;
      if aa>5 then
      dbms_output.put_line(nn.table_name);
      end if;
      end loop;
    end;
    /
      

  5.   

    试问:楼主为何需要数据量>100万的表的信息?
    如果只是想知道用户a114下有哪些大表,按表逐个去统计记录数效率太低也不可取,而且精确的统计值也没太大意思;简单的方式是统计下表占用的空间大小,大概知道有哪些大表了:
    select segment_name,round(sum(bytes)/1024/1024,0) seg_size_mb,
    from user_segments
    group by segment_name order by 2 desc;
    如果有必要,再统计下索引的大小,然后把2部分数据汇总下,就可以得到每个表的数据大小和索引大小.
    如果非要想知道这些大表的数据量处在一个什么级别,采用楼上同志提供的方法全部统计下咯:)PS:1)在不影响系统情况下,适宜地加上paralel提示加快统计
        2)如果想知道表的一个大概数据量级,可以参考sample的语法,同时结合上面提到的表占用大小采用不同的sample值,这样统计速度会快很多,且占用更少的系统资源.
      

  6.   


    必须要对表分析以后,num_rows 才会有值analyze table tablename compute statistics;
      

  7.   

    分析所有表:
    笨方法
    执行下面的sqlSELECT 'ANALYZE  TABLE   ' || TABLE_NAME || '   COMPUTE   STATISTICS;'
      FROM (SELECT DISTINCT TABLE_NAME FROM ALL_COL_COMMENTS A WHERE A.OWNER ='USER');USER 是你的用户将查询出来的结果批量执行一遍。