【发布时间】:2013-07-25 07:52:09
【问题描述】:
我有一个 100 GB 大小的 postgresql 数据库。其中一张表有大约十亿个条目。为了快速输入数据,一些数据被重复并留待以后修剪。其中一列可用于将行标识为唯一的。
我找到了this stackoverflow question,它为 mysql 提出了一个解决方案:
ALTER IGNORE TABLE table_name ADD UNIQUE (location_id, datetime)
postgresql 有类似的吗?
我尝试使用 group by 和行号删除,在这两种情况下,我的计算机在几个小时后都会耗尽内存。
这是我尝试估计表中的行数时得到的结果:
SELECT reltuples FROM pg_class WHERE relname = 'orders';
reltuples
-------------
4.38543e+08
(1 row)
【问题讨论】:
-
你能显示你的表 DDL 和你正在执行的删除语句吗?如果您将删除转换为选择计数(*),您的删除目标是多少行?
-
@JustBob select count(1) 花了一个多小时才停止。
-
我的想法是批量删除。我很好奇您的删除是在 2 行还是 3 亿行之后进行。如果您有一个很好的索引列,它是一个序列,您可以在行集上滑动并从那里删除。您必须编写一个 python 脚本或其他东西来循环从表中删除,其中 id 介于 min 和 max 之间并提交。执行此操作,直到您到达表的末尾,其中 min 和 max 更改为高于上一个的范围,但仍然只在说 50,000 条记录之后。有意义吗?
-
@JustBob 是的,如果归根结底,我将不得不使用光标以编程方式删除重复项。现在试图理解 bma 的建议。我认为您的想法和他的额外专栏可以一起使用以删除重复项。
-
@nurettin 我的建议 #1 假设您正在删除 100GB 表的很大一部分并且不希望与大量删除(或一系列删除)相关联的膨胀.如果您只有几百万行要删除,那么请分批执行,并在每次运行后运行 VACUUM。
标签: postgresql sql-delete postgresql-9.1 large-data