1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| SELECT "tableSchema" as "column", --schemanamen sum("tableSize") / 1024 / 1024 "schemaSize" --schema大小 FROM ( WITH bloat AS ( WITH t1 AS ( SELECT schemaname, tablename, ( 23 + CEIL ( COUNT ( * ) >> 3 ) ) :: BIGINT nullheader, MAX ( null_frac ) nullfrac, CEIL ( SUM ( ( 1 - null_frac ) * avg_width ) ) :: BIGINT datawidth FROM pg_stats GROUP BY schemaname, tablename ), t2 AS ( SELECT schemaname, tablename, ( datawidth + 8 - ( CASE WHEN datawidth % 8 = 0 THEN 8 ELSE datawidth % 8 END ) ) -- avg data len + ( 1 - nullfrac ) * 24 + nullfrac * ( nullheader + 8 - ( CASE WHEN nullheader % 8 = 0 THEN 8 ELSE nullheader % 8 END ) ) avgtuplelen FROM t1 ) SELECT C .oid, avgtuplelen FROM t2 T, pg_class C, pg_namespace n WHERE T.schemaname = n.nspname AND C.relname = T.tablename AND C.relnamespace = n.oid AND relpages > 100 ), parti AS ( SELECT parti.inhparent, parti.inhrelid, stat.n_dead_tup, c.relpages, c.reltuples FROM ( SELECT inhparent, inhrelid FROM pg_inherits inh UNION ALL ( SELECT b.inhparent AS grandpa, A.inhrelid me FROM pg_inherits A INNER JOIN pg_inherits b ON A.inhparent = b.inhrelid ) ) AS parti inner join pg_class c on parti.inhrelid = c.oid LEFT JOIN pg_stat_user_tables stat ON parti.inhrelid = stat.relid ) SELECT n.nspname "tableSchema", C.relname "tableName", SUM ( pg_total_relation_size ( COALESCE ( parti1.inhrelid, C.oid ) ) ) AS "tableSize", --表及其子分区、索引大小,包含索引 round( SUM ( pg_total_relation_size ( COALESCE ( parti1.inhrelid, C.oid ) ) ) / ( SELECT SUM ( pg_database_size ( datname ) ) AS dbsize FROM pg_database ), 4 ) AS tblpercent,-- 表占数据文件比例 COALESCE ( MAX ( c.reltuples ), 0 ) + COALESCE ( SUM ( COALESCE ( parti1.reltuples, 0 ) ), 0 ) AS "tableRows", CASE WHEN (coalesce(max( bloat.avgtuplelen), 0) = 0 and coalesce(avg( parti1.avgtuplelen), 0) = 0) or MAX ( COALESCE (c.relpages , 0 ) ) + SUM ( COALESCE ( parti1.relpages, 0 )) = 0 THEN 0 ELSE round((1 - CEIL ( (MAX ( COALESCE ( c.reltuples, 0 )) + SUM ( COALESCE ( parti1.reltuples, 0 ))) * (case when max( parti1.avgtuplelen) is not null then AVG( parti1.avgtuplelen) else max ( COALESCE ( bloat.avgtuplelen, 0 ) ) end ) / 8168) / ( MAX ( COALESCE (c.relpages , 0 ) ) + SUM ( COALESCE ( parti1.relpages, 0 )) ))::NUMERIC, 2) END AS bloat_pct, COALESCE ( MAX ( stat.n_dead_tup ), 0 ) + COALESCE ( SUM ( COALESCE ( parti1.n_dead_tup, 0 ) ), 0 ) AS "deadTup" --表内死数据行 FROM pg_class C INNER JOIN pg_namespace n ON C.relnamespace = n.oid LEFT JOIN pg_stat_user_tables stat ON C.oid = stat.relid LEFT JOIN (select p.*, b.* from parti p left join bloat as b ON p.inhrelid = b.oid) as parti1 on c.oid = parti1.inhparent LEFT JOIN bloat ON C.oid = bloat.oid WHERE n.nspname NOT IN ( 'pg_catalog', 'information_schema' ) AND n.nspname !~ '^pg_toast' AND C.relkind IN ( 'r', 'p' ) AND C.oid NOT IN ( SELECT inhrelid FROM pg_inherits ) GROUP BY C.relname, n.nspname ORDER BY "tableSize" DESC ) as foo group by "tableSchema" order by "schemaSize" desc
|