通过大量ID获取记录的最佳性能方法

问题描述 投票:0回答:2

我正在编写一个代码查询,以从表中选择所有记录,其中CSV包含一个列值。我发现一个建议,最好的方法是在PostgresQL中使用ARRAY功能。

我有一个表price_mapping,它的主键为id和类型为customer_id的列bigint

我想返回所有将从csv生成的数组中具有客户ID的记录。

我尝试过:

select * from price_mapping
where ARRAY[customer_id] <@ ARRAY[5,7,10]::bigint[]

((5,7,10部分实际上是我的应用插入的csv)

但是我不确定那是正确的。在应用程序中,该数组可能包含十万个ID,因此要确保以最佳性能方法正确执行操作。

在PostgreSQL中通过预定义的列值检索大量记录的正确方法吗?

谢谢

postgresql
2个回答
1
投票

通常,这是通过SQL标准in operator完成的。

in

我不认为使用select * from price_mapping where customer_id in (5,7,10) 会更快。 ARRAY,尽管可能已对其进行了优化。

过去这是最佳选择:

It might be slower given it has to build arrays

但是Postgres的新版本应该为您优化此设置。

在Postgres或数据库驱动程序中传递成千上万个ID可能会遇到查询大小限制,因此您可能希望一次批量处理数千个。


关于最佳性能,答案是不要搜索成千上万的ID。找到将它们联系在一起的something,对该列建立索引,然后按此进行搜索。


0
投票

如果您的数据足够大,请尝试以下操作:

  • 使用FDW(select * from price_mapping where customer_id = ANY(VALUES (5), (7), (10) )读取CSV
  • 如果经常需要此连接,则可以从其中构建物化视图,仅保留所需的列。创建新的CSV时刷新。
  • 将您的表与该外国表或实体化表关联。
© www.soinside.com 2019 - 2024. All rights reserved.