2014-02-13 25 views
32

如何找到数据库,模式的大小,表中红移

我红移的版本是:

PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.735 

如何找出数据库大小,表空间,模式大小&表的大小?

但低于红移不工作(对于以上版本)

SELECT pg_database_size('db_name'); 
SELECT pg_size_pretty(pg_relation_size('table_name')); 

是否有任何替代找出像Oracle(从DBA_SEGMENTS)

为tble大小,我有以下查询,但不确定关于MBYTES的确切记忆。对于第三行,MBYTES = 372.这意味着372 MB?

select trim(pgdb.datname) as Database, trim(pgn.nspname) as Schema, 
trim(a.name) as Table, b.mbytes, a.rows 
from (select db_id, id, name, sum(rows) as rows from stv_tbl_perm a group by db_id, id, name) as a 
join pg_class as pgc on pgc.oid = a.id 
join pg_namespace as pgn on pgn.oid = pgc.relnamespace 
join pg_database as pgdb on pgdb.oid = a.db_id 
join (select tbl, count(*) as mbytes 
from stv_blocklist group by tbl) b on a.id=b.tbl 
order by a.db_id, a.name; 
    database | schema |  table  | mbytes | rows 
---------------+--------------+------------------+--------+---------- 
     postgres | public  | company   |  8 |  1 
     postgres | public  | table_data1_1 |  7 |  1 
     postgres | proj_schema1 | table_data1 | 372 | 33867540 
     postgres | public  | table_data1_2 |  40 | 2000001 

(4 rows) 
+0

选择装饰(pgdb.datname)数据库,修剪(pgn.nspname)为架构, 装饰( a.name)as Table,b.mbytes,a.rows from(select db_id,id,name,sum(rows)as stv_tbl_perm a group by db_id,id,name)作为 将pg_class作为pgc连接到pgc .oid = a.id 加入pg_namespace作为PGN上pgn.oid = pgc.relnamespace 加入pg_database里作为PGDB上pgdb.oid = a.db_id 加入(选择TBL,COUNT(*),如通过TBL从stv_blocklist组字节 )b对a.id = b.tbl 按a.db_id顺序排列,a。名称; -----------这个查询中mbytes的确切含义是什么。 ? – user3258784

回答

14

是的,在你的例子中mbytes是372Mb。下面是我一直使用的是什么:

select 
    cast(use2.usename as varchar(50)) as owner, 
    pgc.oid, 
    trim(pgdb.datname) as Database, 
    trim(pgn.nspname) as Schema, 
    trim(a.name) as Table, 
    b.mbytes, 
    a.rows 
from 
(select db_id, id, name, sum(rows) as rows 
    from stv_tbl_perm a 
    group by db_id, id, name 
) as a 
join pg_class as pgc on pgc.oid = a.id 
left join pg_user use2 on (pgc.relowner = use2.usesysid) 
join pg_namespace as pgn on pgn.oid = pgc.relnamespace 
    and pgn.nspowner > 1 
join pg_database as pgdb on pgdb.oid = a.db_id 
join 
    (select tbl, count(*) as mbytes 
    from stv_blocklist 
    group by tbl 
    ) b on a.id = b.tbl 
order by mbytes desc, a.db_id, a.name; 
+0

这是为我返回0行,任何解决这个? –

+0

这似乎没有在公共模式中获得任何表格 –

+0

“pgn.nspowner> 1”过滤掉了公共模式,这可能是为什么@SandipPingle也没有获取行。 –

11

我不知道有关的数据库和方案分组,但这里是一个简短的方式来获得由表的使用,

SELECT tbl, name, size_mb FROM 
(
    SELECT tbl, count(*) AS size_mb 
    FROM stv_blocklist 
    GROUP BY tbl 
) 
LEFT JOIN 
(select distinct id, name FROM stv_tbl_perm) 
ON id = tbl 
ORDER BY size_mb DESC 
LIMIT 10; 
50

以上答案别t总是给出使用表空间的正确答案。 AWS支持给了这个查询使用方法:

SELECT TRIM(pgdb.datname) AS Database, 
     TRIM(a.name) AS Table, 
     ((b.mbytes/part.total::decimal)*100)::decimal(5,2) AS pct_of_total, 
     b.mbytes, 
     b.unsorted_mbytes 
FROM  stv_tbl_perm a 
JOIN  pg_database AS pgdb 
    ON  pgdb.oid = a.db_id 
JOIN  (SELECT tbl, 
        SUM(DECODE(unsorted, 1, 1, 0)) AS unsorted_mbytes, 
        COUNT(*) AS mbytes 
      FROM  stv_blocklist 
      GROUP BY tbl) AS b 
     ON a.id = b.tbl 
JOIN  (SELECT SUM(capacity) AS total 
      FROM stv_partitions 
      WHERE part_begin = 0) AS part 
     ON 1 = 1 
WHERE a.slice = 0 
ORDER BY 4 desc, db_id, name; 
+0

这是我正在使用的 –

+4

这个查询是否有意在一个片上过滤? 'WHERE a.slice = 0' –

+2

@imcdnzl:什么是unsorted_mbytes?当你计算总内存时,你需要总和mbytes和unsorted_mybytes? – logan

-1

这是我使用的是什么(请改从 'MYDB' 的数据库名称,以你的数据库名):

SELECT CAST(use2.usename AS VARCHAR(50)) AS OWNER 
,TRIM(pgdb.datname) AS DATABASE 
,TRIM(pgn.nspname) AS SCHEMA 
,TRIM(a.NAME) AS TABLE 
,(b.mbytes)/1024 AS Gigabytes 
,a.ROWS 
FROM (
SELECT db_id 
,id 
,NAME 
,SUM(ROWS) AS ROWS 
FROM stv_tbl_perm a 
GROUP BY db_id 
,id 
,NAME 
) AS a 
JOIN pg_class AS pgc ON pgc.oid = a.id 
LEFT JOIN pg_user use2 ON (pgc.relowner = use2.usesysid) 
JOIN pg_namespace AS pgn ON pgn.oid = pgc.relnamespace 
AND pgn.nspowner > 1 
JOIN pg_database AS pgdb ON pgdb.oid = a.db_id 
JOIN (
SELECT tbl 
,COUNT(*) AS mbytes 
FROM stv_blocklist 
GROUP BY tbl 
) b ON a.id = b.tbl 
WHERE pgdb.datname = 'mydb' 
ORDER BY mbytes DESC 
,a.db_id 
,a.NAME; 

源:https://aboutdatabases.wordpress.com/2015/01/24/amazon-redshift-how-to-get-the-sizes-of-all-tables/

+2

这不起作用。它挑选了一些不是最大的表格。 –

5

其他答案之一的修改版本。这包括数据库名,模式名,表名,总行数,磁盘和无序尺寸大小:

-- sort by row count 
select trim(pgdb.datname) as Database, trim(pgns.nspname) as Schema, trim(a.name) as Table, 
    c.rows, ((b.mbytes/part.total::decimal)*100)::decimal(5,3) as pct_of_total, b.mbytes, b.unsorted_mbytes 
    from stv_tbl_perm a 
    join pg_class as pgtbl on pgtbl.oid = a.id 
    join pg_namespace as pgns on pgns.oid = pgtbl.relnamespace 
    join pg_database as pgdb on pgdb.oid = a.db_id 
    join (select tbl, sum(decode(unsorted, 1, 1, 0)) as unsorted_mbytes, count(*) as mbytes from stv_blocklist group by tbl) b on a.id=b.tbl 
    join (select id, sum(rows) as rows from stv_tbl_perm group by id) c on a.id=c.id 
    join (select sum(capacity) as total from stv_partitions where part_begin=0) as part on 1=1 
    where a.slice=0 
    order by 4 desc, db_id, name; 


-- sort by space used 
select trim(pgdb.datname) as Database, trim(pgns.nspname) as Schema, trim(a.name) as Table, 
    c.rows, ((b.mbytes/part.total::decimal)*100)::decimal(5,3) as pct_of_total, b.mbytes, b.unsorted_mbytes 
    from stv_tbl_perm a 
    join pg_class as pgtbl on pgtbl.oid = a.id 
    join pg_namespace as pgns on pgns.oid = pgtbl.relnamespace 
    join pg_database as pgdb on pgdb.oid = a.db_id 
    join (select tbl, sum(decode(unsorted, 1, 1, 0)) as unsorted_mbytes, count(*) as mbytes from stv_blocklist group by tbl) b on a.id=b.tbl 
    join (select id, sum(rows) as rows from stv_tbl_perm group by id) c on a.id=c.id 
    join (select sum(capacity) as total from stv_partitions where part_begin=0) as part on 1=1 
    where a.slice=0 
    order by 6 desc, db_id, name; 
相关问题