5

次の Postgres SQL クエリは、すべてのスキーマのすべてのテーブルとそのサイズとインデックス サイズを一覧表示します。テーブルが単なるインデックス テーブルの場合、100% インデックスとして表示されます。

SELECT schema,
       name,
       pg_size_pretty(CASE WHEN is_index THEN 0 ELSE s      END) AS size,
       pg_size_pretty(CASE WHEN is_index THEN s ELSE st - s END) AS index,
       CASE WHEN st = 0   THEN 0
            WHEN is_index THEN 100
                          ELSE 100 - ((s*100) / st) END || '%' as ratio,
       pg_size_pretty(st) as total
  FROM (SELECT *,
               st = s AS is_index
          FROM (SELECT nspname as schema,
                       relname as name,
                       pg_relation_size(nspname || '.' || relname) as s,
                       pg_total_relation_size(nspname || '.' || relname) as st
                  FROM pg_class
          JOIN pg_namespace ON (relnamespace = pg_namespace.oid)) AS p)                                                           
    AS pp                                                                   
 ORDER BY st DESC LIMIT 30;

次の結果が得られます。

 schema         |          name          |  size   |  index  | ratio |  total
----------------+------------------------+---------+---------+-------+---------
 public         | conf                   | 4072 kB | 4360 kB | 52%   | 8432 kB
 archive        | product_param          | 4048 kB | 3968 kB | 50%   | 8016 kB                                                   
 public         | conf_pkey              | 0 bytes | 4320 kB | 100%  | 4320 kB
 archive        | product_value          | 1568 kB | 1136 kB | 43%   | 2704 kB
 public         | param_mapping          | 1472 kB | 832 kB  | 37%   | 2304 kB
 archive        | supplie_price          | 944 kB  | 896 kB  | 49%   | 1840 kB
 public         | product_param_param_id | 0 bytes | 1552 kB | 100%  | 1552 kB
 archive        | product_param_id       | 0 bytes | 1536 kB | 100%  | 1536 kB

木々の森が見えないところまで来て、少し扱いに​​くくなってきました。

単純化または冗長化できるものがあるかどうか疑問に思っていますか? クエリをもっと単純にすることができる場合、列は必ずしも同じままである必要はありません。

4

4 に答える 4

3

次のクエリを使用すると、(書式が異なる) 同等の結果が得られます。

select
    nspname as schema,
    relname as name,
    pg_relation_size(pg_class.oid) as size,
    pg_indexes_size(pg_class.oid) as index,
    pg_total_relation_size(pg_class.oid) as total,
    100 * case when relkind = 'i' then pg_relation_size(pg_class.oid) 
                                  else pg_indexes_size(pg_class.oid) end 
        / pg_total_relation_size(pg_class.oid) as i_ratio
from 
    pg_class
    join pg_namespace on relnamespace = pg_namespace.oid
order by 5 desc
于 2012-04-05T16:21:46.550 に答える
1

まず第一に、CTE を使用しない理由は、コードをもう少し読みやすくするためです。それからあなたは is_index を返さないので、冗長なようです

with p as (
SELECT nspname as schema,
        relname as name,
        pg_relation_size(nspname || '.' || relname) as s,
        pg_total_relation_size(nspname || '.' || relname) as st
    FROM pg_class
       JOIN pg_namespace 
          ON (relnamespace = pg_namespace.oid)
),
pp as (
SELECT *,
        case when st = s then 0 else s end as size,
        case when st = s then s else st-s end as index

   FROM p
)
select schema,
       name,
       pg_size_pretty(size) as size,        
       pg_size_pretty(index) as index,
       (case st 
             when 0 then 0 
             else index*100 / st 
        end) || '%' ratio,
       st total
 from pp
 order by st desc limit 30;
于 2012-04-04T07:24:23.857 に答える
1

私が本当にやりたいことは、quzary の応答は oid を使用する必要があり、解析して oid に戻すことができない文字列を作成するべきではないことを指摘することだけです。

今、私は適切な投稿を書かなければなりません (これが初心者がコメントするのを止めるポイントかもしれません?) ここに別のクリーンアップされたバージョンがあります:

WITH p AS (
  SELECT n.nspname AS schema,
         c.relname AS name,
         pg_relation_size(c.oid) AS s,
         pg_total_relation_size(c.oid) AS st
  FROM pg_class c, pg_namespace n
  WHERE c.relnamespace = n.oid
)
SELECT schema, name,
  pg_size_pretty(s) AS size,        
  pg_size_pretty(st - s) AS index,
  (100.0 * s / NULLIF(st, 0))::numeric(10,1) AS "% data of total",
  st AS total
FROM p
ORDER BY st DESC
LIMIT 30;

次の行に追加すると便利な場合があることに注意してください。

AND c.relkind = 'r'

WHERE節でp。これにより、リレーション/テーブルのみに制限され、コードがテーブル サイズの一般的な要約に役立ちます。

于 2012-06-26T15:24:56.723 に答える
0

pg_relation_size大文字とpg_total_relation_size小文字を区別しないことを忘れないでください。

pg_relation_size(nspname || '.' || relname)

実際には次のようになります。

pg_relation_size('"' || nspname || '.' || relname || '"')

そのため、大文字でも機能します。(これを理解するのに時間がかかりました)

于 2012-07-19T09:35:48.623 に答える