确定Oracle中具有最大行数的表

时间:2008-12-24 07:08:25

标签: oracle plsql

我在Oracle中有一组表,我想识别包含最大行数的表。

因此,如果A有200行,B有345行,C有120行,我希望能够识别表B.

我可以运行一个简单的查询来实现这个目标吗?

编辑:有100多个表,所以我正在寻找通用的东西。

7 个答案:

答案 0 :(得分:12)

鉴于您说您使用的是Oracle,我只会查询元数据。

select table_name, max(num_rows) from all_tables where table_name in ('A', 'B', 'C');

刚看到你的编辑。只需在没有where子句的情况下运行上面的内容,它将返回数据库中最大的表。唯一的问题可能是您可能获得SYS $表或其他东西。或者,如果您只是为了自己的知识而这样做,那就

select table_name, num_rows from all_tables order by num_rows; 

你会看到最大的是什么。

答案 1 :(得分:4)

架构中具有最大行数的表:

with data as 
(
 select table_name,
        to_number(extractvalue(xmltype(
                  dbms_xmlgen.getxml (
                 ' select count(*) c from ' || table_name)),
                  '/ROWSET/ROW/C')) countrows
 from   user_tables
)
select table_name, countrows
from   data 
where  countrows = (select max(countrows)
                    from   data);

dbms_xmlgen.getxml('select ....')非常灵活。

答案 2 :(得分:3)

这是另一种方法,可能比简单地获取ALL_TABLES.NUM_ROWS慢得多,但它不依赖于已经收集的统计数据并给出精确的当前值 - 尽管当前的数据取决于运行所需的时间!

-- For running in SQLPlus you need this to see the output.
-- If running in Toad or similar tool, output is enabled by default

    SET SERVEROUTPUT ON SIZE 100000

    DECLARE
      l_rows  INTEGER;
      l_max_rows  INTEGER := 0;
      l_table_name  all_tables.table_name%TYPE := NULL;
    BEGIN
      FOR table_record IN (SELECT table_name FROM all_tables) LOOP

        EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||table_record.table_name
          INTO l_rows;

        IF l_rows > l_max_rows THEN
          l_max_rows := l_rows;
          l_table_name := table_record.table_name;
        END IF;
      END LOOP;

      IF l_table_name IS NULL THEN
        dbms_output.put_line( 'All tables are empty' );
      ELSE
        dbms_output.put_line( 'Table ' || table_record.table_name || 
                              ' has ' || TO_CHAR(l_max_rows) || ' rows'
                            );
      END IF;
    END;
    /

答案 3 :(得分:1)

select max(select count(*) from A union select count(*) from B...)

应该有用。

编辑:如果你想要动态的东西,你可以在PL / SQL中用每个“count(*)”子查询构建一个字符串(例如,列出USER_TABLES中的表名),然后用:<执行te主查询/ p>

execute immediate 'select max('||subquery||')'

答案 4 :(得分:1)

你可以通过一次拖网获得相同的结果,如下所示:

SELECT     DISTINCT
           FIRST_VALUE ( t.owner )
             OVER ( ORDER BY t.num_rows DESC NULLS LAST )
                                                 owner,
           FIRST_VALUE ( t.table_name )
             OVER ( ORDER BY t.num_rows DESC NULLS LAST )
                                                 table_name,
           FIRST_VALUE ( t.num_rows )
             OVER ( ORDER BY t.num_rows DESC NULLS LAST )
                                                 num_rows
FROM       all_tables                            t

答案 5 :(得分:1)

David Aldridge正确地指出,由于缺少或过时的表统计信息,查询all_tables可能会给出错误的结果。但是使用user_segments也存在问题;高水位线下方的已删除区块仍将按表格大小计算。

示例:

SQL>create table t as select * from all_objects

Table created.

SQL>select blocks, bytes from user_segments where segment_name = 'T';

    BLOCKS      BYTES
---------- ----------
       768    6291456

SQL>delete from t

52676 rows deleted.

SQL>commit;

Commit complete.

SQL>select count(*) from t;

  COUNT(*)
----------
         0

SQL>select blocks, bytes from user_segments where segment_name = 'T';

    BLOCKS      BYTES
---------- ----------
       768    6291456

SQL>truncate table t;

Table truncated.

SQL>select blocks, bytes from user_segments where segment_name = 'T';

    BLOCKS      BYTES
---------- ----------
         8      65536

答案 6 :(得分:0)

这是一个获取数据库表中最大行数的查询。

select table_name, num_rows from USER_TABLES
where num_rows = (select  max(num_rows) from
(select table_name, num_rows from USER_TABLES));