优化大型数据集的postgress查询



存在一个Postgress数据库表,其中包含大约400万行产品信息。可用列为产品id、SKU、产品条形码(array field(&在这里,用户将上传产品数据的CSV文件。每个产品可能包含多个条形码。数据将根据数据库中现有的产品条形码进行更新。如果条形码已经存在,则会跳过CSV文件中的产品行,或者不会从CSV添加产品。否则,将添加一个包含产品信息的新行,并创建一个任务以手动验证插入的产品。这些验证过程由管理员手动完成。因此,在向表中插入数据之前,我必须检查每一行,因为有大量数据,所以查询时间非常长。条形码列已编入索引。

我用来检查条形码是否存在的查询:

SELECT * FROM retail_retailinventory WHERE ARRAY['*****'] <@ barcodes

然而,如果找不到任何匹配,我必须触发5次插入到不同的模型,如Inventory、PosModel和Task模型。所有这些都是依赖的。因此,必须同步触发此操作。我尝试过使用bulk_create,但由于必须维护模型之间的外键关系,所以还不能成功。这个插入过程填充了大部分内存,并发生超时。

有什么方法可以优化流程吗?或者在这种情况下应用机器学习的范围是什么?我担心的是,如果我应用ML,每次将新行插入数据库时都需要对机器进行训练,这不是一个好的解决方案。

如有任何建议,我们将不胜感激。

谢谢。

如果运行此操作的进程的内存不是问题,则可以执行以下操作:

from itertools import chain
existing_barcodes = set(chain.from_iterable(RetailInventory.objects.all().values_list('barcodes', flat=True)))
while csv_processing:
line = # next csv line
if line['barcode'] in existing_barcodes:
continue

理想情况下,您可以将初始获取限制为仅相关产品。所以可能会在CSV上迭代两次?第一个是获取产品和条形码,这样您就可以在单个查询中看到哪些实际上是新的,然后第二个是处理它们。

您可以创建索引:

create index on retail_retailinventory using GIN (barcodes)

然后将WHERE子句重写为:

WHERE ARRAY['*****'] <@ barcodes

最新更新