我注意到,对于 PostgreSQL 中的表(或视图或物化视图),pg_depend 中有一行将表的 pg_class 行与其模式的 pg_namespace 行链接起来。
但是,我想知道是否存在这样的情况:pg_depend 中的一行可以将 pg_class 行链接到它不在其中的模式的 pg_namespace 行。
这是在如何在不顺序扫描 pg_class 的情况下列出模式中的表?的上下文中,我试图找到一个有效的查询来查找模式中的表,我想知道我是否必须处理这种情况。
我注意到,对于 PostgreSQL 中的表(或视图或物化视图),pg_depend 中有一行将表的 pg_class 行与其模式的 pg_namespace 行链接起来。
但是,我想知道是否存在这样的情况:pg_depend 中的一行可以将 pg_class 行链接到它不在其中的模式的 pg_namespace 行。
这是在如何在不顺序扫描 pg_class 的情况下列出模式中的表?的上下文中,我试图找到一个有效的查询来查找模式中的表,我想知道我是否必须处理这种情况。
在 PostgreSQL 中,我想列出模式中的表。我有以下针对公共模式执行此操作的查询,例如:
SELECT
relname
FROM
pg_class
WHERE
relnamespace = 'public'::regnamespace
AND relkind = 'r';
但是,在我的系统上,这需要大约 400-500 毫秒(有时可能需要更长时间)。我怀疑这是因为 pg_class 有超过 500 万行,大小接近 5GB。
查看查询的解释分析,我看到了以下内容:
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
Gather (cost=1000.00..356932.33 rows=14 width=64) (actual time=2.190..418.126 rows=120 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Parallel Seq Scan on pg_class (cost=0.00..355930.92 rows=6 width=64) (actual time=5.318..375.222 rows=40 loops=3)
Filter: ((relnamespace = '2200'::oid) AND (relkind = 'r'::"char"))
Rows Removed by Filter: 1792453
Planning Time: 0.070 ms
Execution Time: 418.162 ms
我发现它对 pg_class 进行了顺序扫描。查看 pg_class 上的索引,这并不奇怪 - relnamespace 列上没有索引(至少,没有以 relnamespace 作为其第一列的索引)。
那么,在尝试查找模式中的表时,如何避免对 pg_class 进行顺序扫描?这可能吗?
PostgreSQL 咨询锁中的密钥空间是所连接的数据库私有的,还是在数据库集群中共享的?
四处搜寻https://www.postgresql.org/docs/current/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS和https://www.postgresql.org/docs/current/explicit-locking.html#ADVISORY- LOCKS的答案似乎并不明显。
REVOKE ALL PRIVILEGES ON PostgreSQL 表需要什么锁?
具体来说,它是否会被长时间运行的 ALTER TABLE 阻塞,该 ALTER TABLE 会向表中添加一列?
我正在寻找一种在使用时交换表的方法。说我们有一个看法
CREATE OR REPLACE VIEW my_data AS SELECT * FROM my_data_v1;
正在使用,例如很多SELECT * FROM my_data
. 然后我将数据摄取到一个新表中my_data_v2
,然后运行:
CREATE OR REPLACE VIEW my_data AS SELECT * FROM my_data_v2;
这会阻止SELECT
使用原始视图定义的任何语句吗?
在自动提交模式下,PostgreSQL 中的更新是否可能死锁?如果是这样,如何以及为什么?(或者,为什么不呢?)