Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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
Arrays PostgreSQL从与(大)子查询匹配的数组列中删除元素_Arrays_Postgresql - Fatal编程技术网

Arrays PostgreSQL从与(大)子查询匹配的数组列中删除元素

Arrays PostgreSQL从与(大)子查询匹配的数组列中删除元素,arrays,postgresql,Arrays,Postgresql,我有一张这样的桌子(简化): 该表中有500万行,product\u idarray平均包含200个元素。假设我需要从每个sales行中删除特定的失效产品ID。退役产品列表通过子查询products表生成,该表返回大约3000万条记录 现在我这样做(伪代码): 我还尝试了一些基于CTE和嵌套FOR的方法,但每次都出现内存不足错误(8GB工作内存)。array\u remove不允许删除项目的数组参数这一事实也是一个难题 有谁能想出一个更漂亮的方法来做到这一点而不受内存限制吗?我知道这可能不是你想

我有一张这样的桌子(简化):

该表中有500万行,
product\u id
array平均包含200个元素。假设我需要从每个
sales
行中删除特定的失效产品ID。退役产品列表通过子查询
products
表生成,该表返回大约3000万条记录

现在我这样做(伪代码):

我还尝试了一些基于CTE和嵌套FOR的方法,但每次都出现内存不足错误(8GB工作内存)。
array\u remove
不允许删除项目的数组参数这一事实也是一个难题


有谁能想出一个更漂亮的方法来做到这一点而不受内存限制吗?

我知道这可能不是你想听到的,但如果你规范化了你的销售表,这会更容易(也可能更有效)。等待建议:)你可能是指非规范化,因为产品ID会重复。这是我尝试的第一个表结构,但是像“给我所有拥有所有2种特定产品的客户”这样的查询在没有数组的情况下非常复杂和缓慢。将值列表存储在单个列中违反了第一个标准形式,因为
product\u id
不是原子属性。但是对于您提到的查询,这可能是更好的模型。但是,您刚刚发现,反规范化的成本增加了编写的开销。我能想到的唯一(可能非常慢)解决方法是批量删除项目。或者在伪代码中成批聚合(例如,一次聚合500个客户)。数组是否为非原子属性仍有争议,但产品id复制显然违反了3NF。堆方法工作正常,但速度非常慢且不安全。我相信postgre总是通过转换来实现子查询,这是一个更大的问题,例如,mssql的工作方式不是这样的。但这只是一个猜测。无论如何,感谢您的帮助:)嗯,关于“子查询实现的问题”:如果SQL Server没有实现返回3000万行的子查询,我会非常惊讶。(顺便说一句:这是Postgres,从不Postgres)
CREATE TABLE sales
(
  customer_id integer NOT NULL,
  product_ids integer[] NOT NULL,
  CONSTRAINT "PK_customer_id" PRIMARY KEY (customer_id)
);
CREATE INDEX "IDX_product_ids" ON sales USING gin(product_ids);
create table sales_heap ...
insert into sales_heap select customer_id, unnest(product_ids) from sales;
create index product_id on sales_heap ...
delete from sales_heap where product_id in (select product_id from products ...);
truncate table sales;
insert into sales select customer_id, array_agg(product_id) from sales_heap group by customer_id;
drop table sales_heap;