我正在编写一个代码查询,以从表中选择所有记录,其中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中通过预定义的列值检索大量记录的正确方法吗?
谢谢
通常,这是通过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,对该列建立索引,然后按此进行搜索。
如果您的数据足够大,请尝试以下操作:
select *
from price_mapping
where customer_id = ANY(VALUES (5), (7), (10)
)读取CSV