我正在使用一个MVC框架(Zend)做我的应用程序,我想找到PostgreSQL中一个表的总大小(包括索引)。表的名字是 "V5TableName" - 包括引号,因为表名是区分大小写的。我已经确保不涉及任何错别字。
我获取表大小的代码如下所示。
public function getMyTableSize()
{
$sql = "SELECT pg_size_pretty(pg_total_relation_size( '\"V5TableName\"' ) );";
/* Custom_Db is a custom library in my application which makes the PostgreSQL connection
and queries the database
*/
$tableSize = Custom_Db::query($sql)->fetchColumn();
return $tableSize;
}
当我的应用程序调用这个函数时,它在我的日志中返回以下错误。
[22-Apr-2020 09:42:37] PID:30849 ERR: SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "V5TableName" does not exist LINE 1: SELECT pg_size_pretty(pg_total_relation_size( '"V5TableName... ^ query was: SELECT pg_size_pretty(pg_total_relation_size( '"V5TableName"' ) );
如果我在pgAdmin4中运行同样的查询,它完全可以正常运行,返回表的大小(例如:104Mb)。
我已经尝试过。
'public."V5TableName"'
).以上这些似乎都不奏效。我不知道这边到底出了什么问题。
我还试着在我的应用程序中找到数据库的总大小(db名。MyDbName
- 混合大小写),我的查询看起来像下面的东西。
$sql = "SELECT pg_size_pretty(pg_database_size('MyDbName'))"; // this DID NOT WORK
所以我把它改成了下图所示的样子: (成功了)
$sql = "SELECT pg_size_pretty(pg_database_size( current_database() ))"; // this WORKED
我想知道是否有类似的东西可以用来查找表的大小。
你的查询 应 工作。使用双引号似乎是正确的。
SELECT pg_size_pretty(pg_total_relation_size('"V5TableName"'));
首先确保你连接到的是 正确的数据库群 (也就是 "服务器")。它由它的数据目录定义,或者同样毫不含糊地由主机名和端口号定义。阅读手册 此处 和 此处.
然后确保你连接到 正确的数据库 在该数据库集群内。一个Postgres数据库集群由1-n个数据库组成。当不指定实际数据库而进行连接时,最终会在维护数据库中找到名为 postgres
默认情况下。这是最可能的解释。检查与。
SELECT current_database();
然后检查 右表和模式名:
SELECT * FROM pg_tables
WHERE tablename ~* 'V5TableName'; -- ~* matches case-insensitive
第一条谜语应该在此时被解开。
检查你的DB拼写和可能的近似重复。
SELECT datname FROM pg_database;
这个电话是 橆 双引号(就像你试过的那样正确),但需要正确的大写。
SELECT pg_size_pretty(pg_database_size('MyDbName'));
请注意微妙的区别 (如上所述 在手册中):
pg_database_size()
需要 oid
或 name
. 所以要传递区分大小写的数据库名称。无双引号.pg_total_relation_size()
需要 regclass
. 所以传递大小写敏感的关系名为 加双引号 如果你需要保留大写。pg_database_size()
必须有所不同,因为没有专门的数据库对象标识符类型(没有 ).regdatabase
它的要点是:如果可能的话,在Postgres中避免使用双引号标识符。这能让你的生活更轻松。