mysql查询表中的索引字段长度_查看Postgres数据库、表、索引、字段的大小

简介

在postgres里很多时候想要查看数据库、表、字段的大小,做分析。

示例

查看一个pg cluster里所有数据库的大小

SELECT pg_database.datname,pg_size_pretty(pg_database_size(pg_database.oid)) size

FROM pg_catalog.pg_database

WHERE datistemplate=false

ORDER BY pg_database_size(pg_database.oid) DESC;

2d3c1a3417c1a84edf458b04778e4993.png

查看连接的数据里所有用户表的大小

SELECT

relname AS "Table",

pg_size_pretty(pg_total_relation_size(relid)) as "Size",

pg_size_pretty(pg_total_relation_size(relid)-pg_relation_size(relid)) as "External Size"

FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC;

29633df3983c71f3f3471e84a64bab3f.png

Size表示整个表的总大小。

External Size表示与表关联的主键、索引的大小。

查看每个表、索引、toast表的大小

SELECT

relname AS objectname,

relkind AS objecttype,

reltuples AS "#entries",

pg_size_pretty(relpages::bigint*8*1024) AS size

FROM pg_catalog.pg_class

ORDER BY relpages DESC;

73397ae0eab287ebdf050bf641574a43.png

objecttype:

r 表示普通表

i 表示索引

t 表示toast(The Oversized-Attribute Storage Technique)行外存储表

只查看用户表相关的表、索引、toast表大小

WITH user_schema AS (

SELECT relnamespace FROM pg_catalog.pg_statio_user_tables urtb join pg_catalog.pg_class cls on urtb.relid=cls.oid group by relnamespace

)

SELECT

relname AS objectname,

relkind AS objecttype,

reltuples AS "#entries",

pg_size_pretty(relpages::bigint*8*1024) AS size

FROM pg_catalog.pg_class JOIN user_schema ON pg_class.relnamespace=user_schema.relnamespace

ORDER BY relpages DESC;

a8a649de4cc55449764aa7b178e973e1.png

查询某表某列所有项的大小

SELECT pg_size_pretty(pg_column_size("Values")::bigint) valcolsize,"Id","Values" FROM mdm.concept ORDER BY pg_column_size("Values") DESC;

5c335891efa60319dde44a78f175d747.png

查询按外键聚合的字段的总大小

WITH concept_group AS(

SELECT "CodeSystemId",count(*) count,sum(pg_column_size("Values")) sumsize FROM mdm.concept GROUP BY "CodeSystemId" ORDER BY sumsize DESC

) SELECT "CodeSystemId",count "entries", pg_size_pretty(sumsize) FROM concept_group;

d35b0e795c76a0563f3281b3e07eff9b.png

json、jsonb类型字段的大小

postgre中text、json、jsonb等类型的字段会在toast表里存储,故通过pg_column_size表查询出来的列数据是经过toast表序列化、压缩之后的大小,这个大小和它们的字符串表示(包括dump文件)会有较大出入,故建议查询大字段的字符串表示时大小,使用octet_length(col):

SELECT pg_size_pretty(pg_column_size("Content")::bigint) columnSize,pg_size_pretty(octet_length("Content"::text)::bigint) octSize,* FROM mdm."ESB_mock" ORDER BY octet_length("Content"::text) DESC;

10ab7c4a2f4924ffaa6ea09622d033b8.png

参考资料

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值