正在获取删除的锁类型。在PostgreSQL中使用语句?

What type of lock is acquiring delete..using statement in PostgreSQL?

提问人:Dmitriy Busygin 提问时间:11/15/2023 更新时间:11/15/2023 访问量:29

问:

我正在开发预订系统,在某些情况下,拥有良好的性能很重要。

我不想定期在我的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)中注意到,另一个修改语句获得了锁定模式,但是由于以下原因是否存在一些额外的限制?DELETEROW EXCLUSIVEUSING

将查询拆分为 2 个语句并一致地执行它们会更理想吗?

我一直在尝试两种方式进行测试,但我没有发现任何显着差异。

我应该怎么做才能提高应用程序性能?

PostgreSQL 查询优化

评论

0赞 Frank Heikens 11/15/2023
始终从 SQL 语句的查询计划开始。还需要所有涉及的表和索引的 DDL。您期望有多少条记录(在两个表中)?您打算每小时/每天/每月执行多少次此查询?甚至需要执行查询吗?(我们从不删除记录,只是删除整个分区)explain(analyze, verbose, buffers, settings)

答:

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 EXCLUSIVEu1ACCESS SHAREu2