2014-02-13 27 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; 
相關問題