Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除大型postgresql数据库表中的重复行_Postgresql_Sql Delete_Postgresql 9.1_Large Data - Fatal编程技术网

删除大型postgresql数据库表中的重复行

删除大型postgresql数据库表中的重复行,postgresql,sql-delete,postgresql-9.1,large-data,Postgresql,Sql Delete,Postgresql 9.1,Large Data,我有一个100 GB大小的postgresql数据库。其中一个表有大约5亿个条目。对于快速数据输入,一些数据被重复并留到以后进行修剪。其中一列可用于将行标识为唯一 我找到了mysql的解决方案: ALTER IGNORE TABLE table_name ADD UNIQUE (location_id, datetime) postgresql有类似的功能吗 我尝试使用group by和row number进行删除,但在这两种情况下,我的计算机在几个小时后内存不足 这是我尝试估计表中的行数时得

我有一个100 GB大小的postgresql数据库。其中一个表有大约5亿个条目。对于快速数据输入,一些数据被重复并留到以后进行修剪。其中一列可用于将行标识为唯一

我找到了mysql的解决方案:

ALTER IGNORE TABLE table_name ADD UNIQUE (location_id, datetime)
postgresql有类似的功能吗

我尝试使用group by和row number进行删除,但在这两种情况下,我的计算机在几个小时后内存不足

这是我尝试估计表中的行数时得到的结果:

SELECT reltuples FROM pg_class WHERE relname = 'orders';
  reltuples  
-------------
 4.38543e+08
(1 row)

我马上想到两个解决方案:

一,。使用WHERE子句创建一个新表,作为select*from source table,以确定唯一的行。添加索引以匹配源表,然后在事务中重命名它们。这是否适用于您取决于几个因素,包括可用磁盘空间的大小、表是否持续使用以及允许访问中断等。创建新表的好处是将数据和索引紧密打包,由于省略了非唯一行,因此该表将比原始表小

二,。在列上创建部分唯一索引,并添加WHERE子句以过滤掉非唯一性。 例如:

test=# create table t ( col1 int, col2 int, is_unique boolean);
CREATE TABLE

test=# insert into t values (1,2,true), (2,3,true),(2,3,false);
INSERT 0 3

test=# create unique index concurrently t_col1_col2_uidx on t (col1, col2) where is_unique is true;
CREATE INDEX

test=# \d t
        Table "public.t"
  Column   |  Type   | Modifiers 
-----------+---------+-----------
 col1      | integer | 
 col2      | integer | 
 is_unique | boolean | 
Indexes:
    "t_col1_col2_uidx" UNIQUE, btree (col1, col2) WHERE is_unique IS TRUE

能否显示表DDL和正在执行的delete语句?如果你将删除变成选择计数*你的删除目标是多少行?@JustBob select count1在我停止之前花了一个多小时。我的想法是分批删除。我很好奇你的删除是在2行还是3亿行之后。如果您有一个很好的索引列,它是一个序列,那么您可以在一组行上进行滑动并从中删除。您必须编写一个python脚本或其他东西来循环从id在min和max之间的表中删除并提交。这样做,直到到达表的末尾,其中最小值和最大值更改为高于上一个值的范围,但仍然仅在50000条记录之后。有意义吗?@JustBob是的,如果归结到这一点,我将不得不使用光标以编程方式删除重复项。现在正在努力理解bma的建议。我认为您的想法和他的额外列可以一起用于删除重复项。@nurettin我的建议1是基于这样一个假设,即您正在删除100GB表中的一大部分,并且不希望将膨胀与大规模删除或一系列删除相关联。如果您只有几百万行要删除,则分批执行,并在每次运行后运行真空。