postgresql Postgres中简单更新查询的数据库上下文意外性能差

km0tfn4u  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(150)

我有一个用例,根据table 2中id的值更新table 1中的列。我可以在几分之一秒内执行一条SELECT语句,但是更新查询却花费了不合理的时间(大约30多分钟)。
下面是SELECT语句:

-- 0.02 seconds
SELECT id FROM table_1
WHERE table_1.other_id = 1
AND EXISTS (
    SELECT col_1
    FROM table_2
    WHERE table_2.table_1_id = table_1.id)

下面是UPDATE语句:

-- 30 minutes and counting
UPDATE table_1
SET isactive = TRUE
WHERE table_1.other_id = 1
AND EXISTS (
    SELECT col_1
    FROM table_2
    WHERE table_2.table_1_id = table_1.id)

table_1.idtable_1.other_idtable_2.table_1_id上存在btree索引。这里提到的所有id都是整数。布尔值table_1.isactive中没有索引。table_1是~ 16 K记录。table_2约为1.2亿条记录。
任何帮助都是非常欢迎的。
我已经运行了EXPLAIN,但到目前为止无法理解结果。选择的执行计划实际上与更新的执行计划相同。仍在等待查询完成以获取EXPLAIN ANALYZE

bejyjqdl

bejyjqdl1#

正如评论中所指出的,这个查询不应该这么慢。这只是一个交易受阻的问题。我应该更注意查询状态:Lock:transactionid,并检查数据库本身中的阻塞查询。事实证明,这是一个确保先前连接关闭的问题。

相关问题