2014-02-13 2 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')); 

Есть ли альтернативный, чтобы узнать, как оракула (от DBA_SEGMENTS)

для TBLE размера, у меня есть ниже запроса, но не уверен в точном изведении MBYTES. ДЛЯ 3-й строки, MBYTES = 372. это означает 372 МБ?

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) в виде таблицы, b.mbytes, a.rows from (выберите db_id, id, name, sum (rows) в виде строк из 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, граф (*) в качестве мегабайтами из stv_blocklist группы по TBL) 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

Это не работает. Он выбирает небольшой образец таблиц, которые не являются самыми большими. –

4

вы можете проверить этот репозиторий, я уверен, что вы найдете там полезный материал.

https://github.com/awslabs/amazon-redshift-utils

, чтобы ответить на ваш вопрос, вы можете использовать эту точку зрения: https://github.com/awslabs/amazon-redshift-utils/blob/master/src/AdminViews/v_space_used_per_tbl.sql

и затем запрос, как вам нравится. например: select * from admin.v_space_used_per_tbl;

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; 
Смежные вопросы