2010-12-11 3 views
16

데이터베이스의 양식 결과를 반환하는 쿼리를 찾고 있습니다 (데이터베이스에서 사용하는 총 공간이 40GB라고 가정 할 경우 아래 예제 참조)PostgreSQL 데이터베이스에서 크기 (상대적 및 절대)가있는 스키마 목록

schema | size | relative size 
----------+------------------- 
foo | 15GB | 37.5%  
bar | 20GB |  50% 
baz | 5GB | 12.5% 

나는 유용했다 스키마, 으로 분류 데이터베이스에 공간을 사용하여 개체의 목록을 섞어서 관리했지만, 이것에서 스키마 당 요약 정보를 얻는 것은 너무 쉽게 보이지 않는다. 아래를 참조하십시오.

SELECT relkind, 
     relname, 
     pg_catalog.pg_namespace.nspname, 
     pg_size_pretty(pg_relation_size(pg_catalog.pg_class.oid)) 
FROM pg_catalog.pg_class 
     INNER JOIN pg_catalog.pg_namespace 
     ON relnamespace = pg_catalog.pg_namespace.oid 
ORDER BY pg_catalog.pg_namespace.nspname, 
      pg_relation_size(pg_catalog.pg_class.oid) DESC; 

이는 SUM 같은 집합 연산자, 즉 아니 성공까지 필요할 수있다 이용 같다

relkind |    relname    |  nspname  | pg_size_pretty 
---------+---------------------------------------+--------------------+---------------- 
    r  | geno         | btsnp    | 11 GB 
    i  | geno_pkey        | btsnp    | 5838 MB 
    r  | anno         | btsnp    | 63 MB 
    i  | anno_fid_key       | btsnp    | 28 MB 
    i  | ix_btsnp_anno_rsid     | btsnp    | 28 MB 
    [...] 
    r  | anno         | btsnp_shard  | 63 MB 
    r  | geno4681        | btsnp_shard  | 38 MB 
    r  | geno4595        | btsnp_shard  | 38 MB 
    r  | geno4771        | btsnp_shard  | 38 MB 
    r  | geno4775        | btsnp_shard  | 38 MB 

같은 결과를 제공한다.

SELECT schema_name, 
     sum(table_size), 
     (sum(table_size)/database_size) * 100 
FROM (
    SELECT pg_catalog.pg_namespace.nspname as schema_name, 
     pg_relation_size(pg_catalog.pg_class.oid) as table_size, 
     sum(pg_relation_size(pg_catalog.pg_class.oid)) over() as database_size 
    FROM pg_catalog.pg_class 
    JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid 
) t 
GROUP BY schema_name, database_size


편집 :

                    Regards, Faheem 
+0

죄송합니다, 개조 할 수있는 ' 귀하의 계정을 다른 SE 사이트 계정과 연결하십시오. tex 사이트에서 동일한 정보로 등록하면 자동으로 연결되어야합니다. 그렇지 않다면 메타에 대한 질문을 열고 거기에 도움을 요청하십시오. – Will

+0

@ 위 : 모든 사이트의 정보는 동일해야합니다. 좋아, 나는 그것을 메타에 가져갈 것이다. 감사. –

답변

28

이 시도 단지 데이터베이스 크기를 얻기 위해 모든 테이블을 합산와 해결 방법을 발견 할 필요가 없습니다 :

 
SELECT schema_name, 
     pg_size_pretty(sum(table_size)::bigint), 
     (sum(table_size)/pg_database_size(current_database())) * 100 
FROM (
    SELECT pg_catalog.pg_namespace.nspname as schema_name, 
     pg_relation_size(pg_catalog.pg_class.oid) as table_size 
    FROM pg_catalog.pg_class 
    JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid 
) t 
GROUP BY schema_name 
ORDER BY schema_name 
+0

대단히 감사합니다. 위의 JOIN은 INNER JOIN과 같습니다. –

+0

흠. 퍼센트 값을 두 자릿수로 자르는 것이 가능한지 궁금합니다. –

+0

trunc ((sum (table_size)/pg_database_size (current_database())) * 100, 2) AS 퍼센트를 사용할 수 있습니다. #postgresql의 merlin83에게 감사드립니다. –

관련 문제