pg_relation_size 告诉我列不存在

pst*_*ton 4 postgresql

http://www.postgresql.org/docs/8.4/static/functions-admin.html说:

pg_relation_size
接受表、索引或 Toast 表的 OID 或名称,并返回大小(以字节为单位)

但是,当我将它与有效的表名一起使用时,我收到错误:

[表] 不存在...

我知道我的桌子存在,因为这样做

SELECT count(*) FROM [table]
Run Code Online (Sandbox Code Playgroud)

返回一个有效的数字。有任何想法吗?

est*_*ani 6

尽管原因不同,但我遇到了同样的错误。pg_relation_size 不区分大小写,因此如果您有小写以外的任何内容,它将无法开箱即用:

postgres=> SELECT pg_size_pretty(pg_total_relation_size('MyTable'));
ERROR:  relation "mytable" does not exist
LINE 1: SELECT pg_size_pretty(pg_total_relation_size('mytable...
                                                     ^
postgres=> SELECT pg_size_pretty(pg_total_relation_size('"MyTable"'));
 pg_size_pretty
----------------
 225 MB
(1 row)
Run Code Online (Sandbox Code Playgroud)

因此,为了使其在 SELECT 语句中起作用,您需要将表名括在引号中:

postgres=> SELECT relname, nspname, pg_size_pretty(pg_relation_size('"' || relname || '"')) 
  FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = c.relnamespace  
  WHERE c.relkind IN ('r','') AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND pg_table_is_visible(c.oid) 
  ORDER BY c.relpages DESC;
Run Code Online (Sandbox Code Playgroud)

  • 我必须这样写:`select pg_size_pretty(pg_total_relation_size('"MyTable"'));`也就是说,表名是双引号和单引号的。 (5认同)