在PostgreSQL中删除大量随机行的最佳方法

Poo*_*oja 3 postgresql

我有一个包含约90万行的表。我想删除约90%的行。尝试使用TABLESAMPLE随机选择它们,但性能没有太大提高。这是我尝试过的查询,还有很多次

sql> DELETE FROM users WHERE id IN (
SELECT id FROM users ORDER BY random() LIMIT 5000
)
[2017-11-22 11:35:39] 5000 rows affected in 1m 11s 55ms


sql> DELETE FROM users WHERE id IN (
SELECT id FROM users TABLESAMPLE BERNOULLI (5)
)
[2017-11-22 11:55:07] 5845 rows affected in 1m 13s 666ms


sql> DELETE FROM users WHERE id IN (
SELECT id FROM users TABLESAMPLE SYSTEM (5)
)
[2017-11-22 11:57:59] 5486 rows affected in 1m 4s 574ms
Run Code Online (Sandbox Code Playgroud)

仅删除5%的数据大约需要一分钟。因此,大数据将花费很长时间。请建议我是否做正确的事,或者是否有更好的方法来做到这一点。

a_h*_*ame 6

删除大量的行总是很慢。您如何识别它们并没有多大区别。

创建一个包含要保留的行的新表通常比删除大量表通常要快得多,例如:

create table users_to_keep
as
select *
from users
tablesample system (10);
Run Code Online (Sandbox Code Playgroud)

然后截断原始表并插入存储的行:

truncate table users;
insert into users
select *
from users_to_keep;
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以在一次交易中完成。