Federico Razzoli Asked: 2021-11-14 12:58:06 +0800 CST2021-11-14 12:58:06 +0800 CST 2021-11-14 12:58:06 +0800 CST 哪个更快:pg_catalog 或 information_schema? 772 pg_catalog我理解和之间的高级差异information_schema。 但在许多情况下,工具可以选择使用其中任何一个。我想知道是否有性能原因我们应该选择其中一个。预计其中之一的查询会更快吗?它们在锁方面的工作方式是否相同? postgresql information-schema 1 个回答 Voted Best Answer Erwin Brandstetter 2021-11-14T15:57:19+08:002021-11-14T15:57:19+08:00 通常,pg_catalog速度更快。 Postgres 中真正的信息来源是pg_catalog. 中的观点information_schema基于这些。有时这些视图相当复杂以符合 SQL 标准。 对于针对信息模式视图的每个查询,有一个直接基于pg_catalog表的更快的替代方案,省去了中间人。 看: 获取查询、表或视图的列名和数据类型 对于简单的查询,它并不重要。但是,如果您以高频率重复查询,或者对于更复杂的情况,它可能会很重要。通常情况下,信息模式视图会做很多您没有要求的工作。比较这两个查询: EXPLAIN ANALYZE SELECT * FROM pg_catalog.pg_attribute; EXPLAIN ANALYZE SELECT * FROM information_schema.columns; db<>在这里摆弄 1 毫秒 vs 200 毫秒(当然取决于数据库中的列数)。这就是遵守标准的代价——这也是使用信息模式的主要原因:查询在主要 Postgres 版本中是稳定的(但目录表的核心列也几乎不会改变)并且(理论上)可移植到其他关系型数据库。(但编写“可移植”代码是一项棘手的工作,除非绝对必须,否则我不会尝试。) 有关的: postgresql触发器函数中不区分大小写的列名 有时,两者都不是最好的选择。有许多专用的系统信息功能,或者转换为对象标识符类型可以简化或解决任务。例子: 如何检查给定模式中是否存在表 检索所有 PK 和 FK 至于锁:您通常不必担心 Postgres 中的问题。由于MVCC 模型,读者不会阻止作者,反之亦然。如果有的话,这将information_schema是一个更大的问题,因为它通常会引入比必要更多的目录表。
通常,
pg_catalog
速度更快。Postgres 中真正的信息来源是
pg_catalog
. 中的观点information_schema
基于这些。有时这些视图相当复杂以符合 SQL 标准。对于针对信息模式视图的每个查询,有一个直接基于
pg_catalog
表的更快的替代方案,省去了中间人。看:
对于简单的查询,它并不重要。但是,如果您以高频率重复查询,或者对于更复杂的情况,它可能会很重要。通常情况下,信息模式视图会做很多您没有要求的工作。比较这两个查询:
db<>在这里摆弄
1 毫秒 vs 200 毫秒(当然取决于数据库中的列数)。这就是遵守标准的代价——这也是使用信息模式的主要原因:查询在主要 Postgres 版本中是稳定的(但目录表的核心列也几乎不会改变)并且(理论上)可移植到其他关系型数据库。(但编写“可移植”代码是一项棘手的工作,除非绝对必须,否则我不会尝试。)
有关的:
有时,两者都不是最好的选择。有许多专用的系统信息功能,或者转换为对象标识符类型可以简化或解决任务。例子:
至于锁:您通常不必担心 Postgres 中的问题。由于MVCC 模型,读者不会阻止作者,反之亦然。如果有的话,这将
information_schema
是一个更大的问题,因为它通常会引入比必要更多的目录表。