我有一个包含约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%的数据大约需要一分钟。因此,大数据将花费很长时间。请建议我是否做正确的事,或者是否有更好的方法来做到这一点。
删除大量的行总是很慢。您如何识别它们并没有多大区别。
创建一个包含要保留的行的新表通常比删除大量表通常要快得多,例如:
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)
如果需要,您可以在一次交易中完成。
| 归档时间: |
|
| 查看次数: |
1053 次 |
| 最近记录: |