2013-10-22 7 views

Antwort

37

Verwenden Anfragen von dieser Präsentation: http://www.slideshare.net/AmazonWebServices/amazon-redshift-best-practices

Speicherplatznutzung für die Cluster-Analyse:

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; 

Tabelle Verteilung zwischen den Knoten Analyse:

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

hey, überprüfen Sie meinen Kommentar, es ist ein potenzieller Fehler bei Ihrer Abfrage. – Diego

1

Hinzufügen Besitzer und ein Schema Filter zu der obigen Abfrage:

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

Anzahl sollte gezählt werden (*) –

+0

oder Anzahl (Blocknummer) – rohitkulky

0

Ich dachte nur, ich würde dies erweitern, da ich mit einer ungleichmäßigen Verteilung konfrontiert bin. Ich habe einige Links und Felder hinzugefügt, um die Analyse von Speicherplatz nach Knoten und Slice zu ermöglichen. Auch hinzugefügt werden, max/min-Werte und die Anzahl der Werte pro Scheibe für Spalte 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

Ich weiß, diese Frage ist alt und hat bereits eine Antwort akzeptiert, aber muss ich darauf hinweisen, dass die Antwort falsch ist. Was die Abfrage dort als "mb" ausgibt, ist eigentlich die "Anzahl der Blöcke". Die Antwort wäre nur dann korrekt, wenn die Blockgröße 1 MB beträgt (was der Standardwert ist).

Wenn die Blockgröße unterschiedlich ist (in meinem Fall zum Beispiel 256K), müssen Sie die Anzahl der Blöcke mit ihrer Größe in Bytes multiplizieren. Ich schlage vor, die folgende Änderung Ihrer Abfrage, wo ich die Anzahl der Blöcke durch die Blockgröße in Byte multiplizieren (262.144 Bytes) und teilen sich dann durch (1024 * 1024), um die Summe in Megabyte:

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

Kann die Blockgröße in Rotverschiebung geändert werden? Ich habe eine Weile nach Informationen darüber gesucht und keine Möglichkeit gefunden, dies zu tun. –

+0

Ich glaube, du kannst. Auf früheren Paraccel (Actian Matrix - Redshift Vorgänger), können Sie das steuern, indem Sie den Wert von block_size in der padb.conf ändern. Bei Rotverschiebung sollte etwas in derselben Zeile sein – Diego