2013-10-22 36 views

回答

37

从该演示使用查询:http://www.slideshare.net/AmazonWebServices/amazon-redshift-best-practices

分析磁盘空间使用情况集群:

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 mbytes desc, a.db_id, a.name; 

分析节点之间的表分配:一个模式过滤器

select slice, col, num_values, minvalue, maxvalue 
from svv_diskusage 
where name = '__INSERT__TABLE__NAME__HERE__' and col = 0 
order by slice, col; 
+0

嘿,检查我的评论,你的查询存在潜在的错误。 – Diego

1

添加所有者和到以上查询:

select 
cast(use.usename as varchar(50)) as owner, 
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 use on (pgc.relowner = use.usesysid) 
join pg_namespace as pgn on pgn.oid = pgc.relnamespace 
    -- leave out system schemas 
    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

count应该是count(*) –

+0

或count(blocknum) – rohitkulky

0

刚想过我会扩大这个,因为我面临着一个不均匀分布的问题。我添加了一些链接和字段,以便按节点和切片分析空间。同时添加的最大/最小值,并且每片价值数0列

select 
cast(use.usename as varchar(50)) as owner, 
trim(pgdb.datname) as Database, 
trim(pgn.nspname) as Schema, 
trim(a.name) as Table, 
a.node, 
a.slice, 
b.mbytes, 
a.rows, 
a.num_values, 
a.minvalue, 
a.maxvalue 
from 
(select 
    a.db_id, 
    a.id, 
    s.node, 
    s.slice, 
    a.name, 
    d.num_values, 
    d.minvalue, 
    d.maxvalue, 
    sum(rows) as rows 
    from stv_tbl_perm a 
    inner join stv_slices s on a.slice = s.slice 
    inner join (
    select tbl, slice, sum(num_values) as num_values, min(minvalue) as minvalue, max(maxvalue) as maxvalue 
    from svv_diskusage 
    where col = 0 
    group by 1, 2) d on a.id = d.tbl and a.slice = d.slice 
    group by 1, 2, 3, 4, 5, 6, 7, 8 
) as a 
join pg_class as pgc on pgc.oid = a.id 
left join pg_user use on (pgc.relowner = use.usesysid) 
join pg_namespace as pgn on pgn.oid = pgc.relnamespace 
    -- leave out system schemas 
    and pgn.nspowner > 1 
join pg_database as pgdb on pgdb.oid = a.db_id 
join 
    (select 
    tbl, 
    slice, 
    count(*) as mbytes 
    from stv_blocklist 
    group by tbl, slice 
) b on a.id = b.tbl 
    and a.slice = b.slice 
order by mbytes desc, a.db_id, a.name, a.node; 
9

我知道这个问题是旧的,已经接受了答案,但我必须指出的是,答案是错误的。 查询以“mb”输出的内容实际上是“块数”。只有块大小为1MB(这是默认值),答案才是正确的。

如果块大小不同(在我的情况下,例如是256K),则必须将块数乘以其大小(以字节为单位)。我建议如下修改您的查询,我的块大小相乘以字节为单位(262144个字节)块的数量,然后通过(1024 * 1024),以MB为单位的总分为输出:

select 
    trim(pgdb.datname) as Database, 
    trim(pgn.nspname) as Schema, 
    trim(a.name) as Table, 
    b.mbytes as previous_wrong_value, 
    (b.mbytes * 262144)::bigint/(1024*1024) as "Total 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(blocknum) as mbytes 
    from stv_blocklist 
    group by tbl 
) b on a.id = b.tbl 
order by mbytes desc, a.db_id, a.name; 
+0

是否可以在redshift中更改块大小?我一直在寻找这方面的信息,但没有找到任何方法。 –

+0

我相信你可以。在以前的Paraccel(实际Actian Matrix - redshift的前身)上,您可以通过更改padb.conf中的block_size的值来控制它。在红移上应该是同一行上的东西 – Diego