Oracle 查詢用戶下表名,表列數,錶行數,表大小的SQL

最近想分析下數據庫的信息, 然後寫了這個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 

具體效果就不描述了. 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章