首页 > 数据库 >Oracle 查询用户下表名,表列数,表行数,表大小的SQL

Oracle 查询用户下表名,表列数,表行数,表大小的SQL

时间:2022-12-02 09:58:00浏览次数:32  
标签:name tablename 表列 表行数 下表名 SQL table segment SELECT

最近想分析下数据库的信息, 然后写了这个SQL. 比较lowB一些. 

因为Oracle的 deferred_segment_creation 参数的影响.
很多表如果是0行,那么是不会创建extents 存储信息.
所以很多取出来的表大小信息为空. 

这也就导致了查询结果表大小为空的情况. 
为了能够准确显示表信息, 我这边进行了 left outer join的操作

SQL比较简单未进行任何优化

有多个至少两重的关联子查询用来展示结果. 

 

具体SQL为:

SELECT
    x.table_name AS 表名,
    x.表行数,
    x.表列数,
    y.表大小 AS 表大小单位MB 
FROM
    (
    SELECT
        b.table_name,
        a.num_rows AS 表行数,
        b.count1 AS 表列数 
    FROM
        user_tables a
        INNER JOIN ( SELECT table_name, count( column_name ) AS count1 FROM user_tab_columns GROUP BY table_name ) b ON a.table_name = b.table_name 
    ORDER BY
        b.table_name 
    ) x LEFT outer
    JOIN (
    SELECT
        sum( tablesize ) AS 表大小,
        tablename 
    FROM
        (
        SELECT
            sum( C.bytes ) / 1024 / 1024 AS tablesize,
            C.table_name AS tablename 
        FROM
            ( SELECT A.table_name, B.bytes FROM user_lobs A, user_extents B WHERE A.segment_name = B.segment_name ) C 
        GROUP BY
            C.table_name UNION ALL
        SELECT
            sum( bytes ) / 1024 / 1024 AS tablesize,
            segment_name AS tablename 
        FROM
            user_extents 
        WHERE
            segment_type = 'TABLE' 
        GROUP BY
            segment_name 
        ) 
    GROUP BY
        tablename 
    ORDER BY
        1 DESC 
    ) y ON x.table_name = y.tablename 
ORDER BY
    y.表大小 desc 

具体效果就不描述了. 

标签:name,tablename,表列,表行数,下表名,SQL,table,segment,SELECT
From: https://www.cnblogs.com/jinanxiaolaohu/p/16943452.html

相关文章

  • 为什么说MySQL单表行数不要超过2000w?
    作为在后端圈开车的多年老司机,是不是经常听到过,“mysql单表最好不要超过2000w”,“单表超过2000w就要考虑数据迁移了”,“你这个表数据都马上要到2000w了,难怪查询速度......
  • 为什么mysql单表行数建议不要超过2000w?
    mysql使用innodb的B+树存储表项,保存在.ibd文件中,其中叶子节点页存储数据页,非叶子节点页存储索引页.ibd文件的一页大小16kb,其中有15kb存记录。假设每页的记录都存满一页:1.非......