我正在尝试探索
pg_buffercache
扩展并在使用 pg_buffercache_pages()
函数时面临错误。
错误如下:
test=# SELECT pg_buffercache_pages();
ERROR: return type must be a row type
test=# SELECT * FROM pg_buffercache_pages();
ERROR: a column definition list is required for functions returning "record"
LINE 1: SELECT * FROM pg_buffercache_pages();
^
-- taken from .sql file of regress test
test=# SELECT * FROM pg_buffercache_pages() AS p (wrong int);
ERROR: incorrect number of output arguments
我已确认我以超级用户身份登录,同时我已浏览文档但找不到如何运行此功能。
此功能不适合直接使用,而是通过
pg_buffercache
视图使用。如果您查看该视图的定义,您将看到它是如何被调用的:
\d+ pg_buffercache
View "public.pg_buffercache"
Column │ Type │ Collation │ Nullable │ Default │ Storage │ Description
══════════════════╪══════════╪═══════════╪══════════╪═════════╪═════════╪═════════════
bufferid │ integer │ │ │ │ plain │
relfilenode │ oid │ │ │ │ plain │
reltablespace │ oid │ │ │ │ plain │
reldatabase │ oid │ │ │ │ plain │
relforknumber │ smallint │ │ │ │ plain │
relblocknumber │ bigint │ │ │ │ plain │
isdirty │ boolean │ │ │ │ plain │
usagecount │ smallint │ │ │ │ plain │
pinning_backends │ integer │ │ │ │ plain │
View definition:
SELECT bufferid,
relfilenode,
reltablespace,
reldatabase,
relforknumber,
relblocknumber,
isdirty,
usagecount,
pinning_backends
FROM pg_buffercache_pages() p(bufferid integer, relfilenode oid, reltablespace oid, reldatabase oid, relforknumber smallint, relblocknumber bigint, isdirty boolean, usagecount smallint, pinning_backends integer);
该错误的原因是该函数被定义为返回
SETOF record
,因此您在调用该函数时必须指定该函数返回的列。