提问人:Dmitriy Busygin 提问时间:11/15/2023 更新时间:11/15/2023 访问量:29
正在获取删除的锁类型。在PostgreSQL中使用语句?
What type of lock is acquiring delete..using statement in PostgreSQL?
问:
我正在开发预订系统,在某些情况下,拥有良好的性能很重要。
我不想定期在我的Postgres数据库中执行这样的操作:
DELETE FROM table t1
USING table t2
WHERE t1.updated < t2.updated
AND t1.attr = t2.attr
我知道 Postgres 提供了各种锁定模式来控制对数据的并发访问,其中一些会在查询执行时自动使用。
在官方文档(https://www.postgresql.org/docs/current/explicit-locking.html)中注意到,另一个修改语句获得了锁定模式,但是由于以下原因是否存在一些额外的限制?DELETE
ROW EXCLUSIVE
USING
将查询拆分为 2 个语句并一致地执行它们会更理想吗?
我一直在尝试两种方式进行测试,但我没有发现任何显着差异。
我应该怎么做才能提高应用程序性能?
答:
1赞
Laurenz Albe
11/15/2023
#1
你可以通过一个实验很容易地弄清楚:
BEGIN;
DELETE FROM uni u1
USING uni u2
WHERE u1.id = u2.id;
-- get all the table locks on "uni" by the current session
SELECT mode
FROM pg_locks
WHERE pid = pg_backend_pid()
AND relation = 'uni'::regclass;
mode
══════════════════
AccessShareLock
RowExclusiveLock
(2 rows)
有一个锁和一个锁。后者是不必要的,因为它是同一张表,而且前者比后者更强,但尝试优化它是没有回报的。ROW EXCLUSIVE
u1
ACCESS SHARE
u2
评论
explain(analyze, verbose, buffers, settings)