【发布时间】:2021-09-22 10:49:38
【问题描述】:
我确实有以下查询,我正在对一个 postgresql 数据库运行它,该数据库在表 account_message 中有超过 10M 的条目,在表 message 中有超过 1M 的条目。
Postgresql 的版本为PostgreSQL 11.12, compiled by Visual C++ build 1914, 64-bit
有什么办法可以让这个查询更快,因为它已经花费了超过 2 天而且还没有完成。
DELETE FROM account_message WHERE message_id in
(SELECT t2.id FROM message t2 WHERE NOT EXISTS
(SELECT 1 FROM customer t1 WHERE
t1.username = t2.username));
表account_message 具有以下列:
id (bigint)(primary key)
user_id (bigint)
message_id (bigint)
isRead (boolean)
isDeleted (boolean)
表message 具有以下列:
id (bigint)(primary key)
username (character varying)(255)
text (character varying)(10000)
details(character varying)(1000)
status(integer)
表customer 具有以下列:
username (character varying)(255)(primary key)
type(character varying)(500)
details(character varying)(10000)
status(integer)
active(boolean)
这对我有用,而且速度更快。
DELETE FROM account_message WHERE message_id IN (
SELECT m.id FROM message m
LEFT JOIN customer c ON m.username = c.username
WHERE c.username IS NULL LIMIT 1000)
【问题讨论】:
-
您的表是否有适当的索引,即
message_id和username? -
我如何检查这个?例如使用 pgAdmin。
-
我会尝试这样的事情:
select * from pg_indexes where lower(tablename) in ('account_message', 'message', 'customer'); -
尝试将
IN (SELECT ...)转换成EXISTS (SELECT ...)。
标签: postgresql query-optimization