本帖最后由 heierbao6 于 2010-03-09 13:28:44 编辑

解决方案 »

  1.   

    以前整过的,可惜,找不到了,给你个思路。
    不需要all_objects,循环遍历all_tables,提取出所有表名(包括你有访问权的、其他用户的表)。
    然后使用动态SQL拼凑sqr_str := 'select count(*) from '||table_name;将执行结果放进一个变量。每count一次,累加一次。最后得出总和,K.O!
      

  2.   

    忘记说一点了,如果是其他用户的表,这样拼凑会有问题,需要加上schema前缀。sqr_str := 'select count(*) from '||v_owner||'.'||v_table_name; 
      

  3.   

    一亿多个也可以,只是执行时间长点。
    SQL无法实现,必须借助PL/SQL。
    要么all_tables里有num_rows字段,其值有表的行数,但这个只是统计分析的估计值,如果是大表,偏差很大
      

  4.   

    select  sum(t.num_rows) 
    from all_tables  t where t.owner='111' and t.num_rows > 0这个语句对吗,我执行后明明数据库中有数据,怎么结果是空呢?
      

  5.   

    如果是对某个用户下的所有的表的话,可以用dbms_stats统计一下整个schema的信息,然后直接select sum(num_rows) from user_tables
      

  6.   

    select  sum(t.num_rows) 
    from all_tables  t where t.owner='111' and t.num_rows > 0
    --------------------
    上面这个语句需要先对表进行analyze
    并且得到的信息为analyze时的数据,也就是非实时的数据。
      

  7.   

    每张表都analyze?表太多了,写不过来呀,如果数据库中数据有几百万,这样执行后数据库会相差很大吗
      

  8.   

    --用ANALYZE是不好的,如果抽样分析不准确,如果要全部分析,有些大表是很慢的。
    --再说了,统计数据是为了基于COST的优化,不是精确统计数据行的哈
    --还是写一个函数吧,初步验证没问题哈
    CREATE OR REPLACE FUNCTION calcrows(i_schema_name VARCHAR2) RETURN NUMBER IS
      v_sqlstr    VARCHAR2(4000);
      v_totalrows NUMBER;
      v_temprows  NUMBER;
    BEGIN
      v_totalrows := 0;
      FOR c IN (SELECT t.OBJECT_NAME
                  FROM all_objects t
                 WHERE t.OWNER = upper(i_schema_name) AND
                       t.OBJECT_TYPE = 'TABLE') LOOP
        v_sqlstr := 'select count(*) from ' || c.object_name;
        BEGIN
          EXECUTE IMMEDIATE v_sqlstr
            INTO v_temprows;
        EXCEPTION
          WHEN OTHERS THEN
            v_temprows := 0;
        END;
        v_totalrows := v_totalrows + v_temprows;
      END LOOP;
      RETURN v_totalrows;
    END calcrows;