Fed*_*oli 3 postgresql information-schema pg-catalog
pg_catalog我了解和之间的高级差异information_schema。
但在许多情况下,工具可以选择使用其中任何一个。我想知道是否存在性能原因导致我们应该选择其中之一。其中之一的查询预计会更快吗?它们在锁方面的工作方式相同吗?
通常,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;
Run Code Online (Sandbox Code Playgroud)
db<>在这里摆弄
1 毫秒 vs 200 毫秒(当然取决于数据库中的列数)。这就是遵守标准的代价 - 这也是使用信息模式的主要原因:查询在主要 Postgres 版本中是稳定的(但目录表的核心列也几乎不会改变)并且(理论上)可移植到其他关系型数据库管理系统。(但是编写“可移植”代码是一件棘手的事情,除非绝对必须,否则我不会尝试。)
有关的:
有时,两者都不是最好的选择。有许多专用的系统信息函数,或者转换为对象标识符类型可以简化或解决任务。例子:
至于锁:在 Postgres 中你通常不必担心这一点。感谢MVCC 模型,读者不会阻止作者,反之亦然。如果有的话,这information_schema也是一个更大的问题,因为它通常会引入不必要的目录表。