【问题标题】:The most efficient method of performing a large number of similar SELECT queries on PostgreSQL?在 PostgreSQL 上执行大量类似 SELECT 查询的最有效方法?
【发布时间】:2019-10-21 14:38:11
【问题描述】:

我有一组大表,每个表都有很多记录。我正在编写一个 Python 程序,根据这些记录上多个列的值,SELECTs 来自这些表的大量记录。

基本上,这些将是很多形式的查询:

SELECT <some columns> FROM <some table> WHERE <column1=val1 AND column2=val2...>

每个表都有一组不同的列,否则上面的SELECT 公式成立。

默认情况下,我打算通过psycopg2 PostgreSQL 数据库驱动程序运行所有这些查询,每个查询都作为一个单独的查询。但我想知道是否有更有效的方法来解决这个问题,因为这样的查询数量非常多——数千甚至更多。

【问题讨论】:

  • 如果您的表具有相同的列,则您的数据模型有问题。通常,对于给定的一组列,您只需要一个表。它使这样的查询变得更加简单。
  • 表格有,而不是字段。
  • @GordonLinoff 不同的表有不同的列集。我会看看我是否可以编辑我的问题以使其更清楚。
  • 如果您有这些查询一一进入,那么您无能为力,除了优化查询、使用索引、分区(如果需要)等。如果您要批量选择多条记录,但是,有一些选项:主要思想是基于类似查询(具有相同的列)创建临时查询表并在这些过滤表上执行JOINs - 这可能会显着加快您的查询速度,具体取决于您拥有的查询。
  • @SergeyKudriavtsev 这些查询是由程序批量生成的。所以你的想法可能会奏效。

标签: python sql postgresql psycopg2 rdbms


【解决方案1】:

如果SELECT 列表条目对于所有查询都相同(条目数量和数据类型相同),则可以使用UNION ALL 组合多个此类查询。这不会减少数据库的工作量,但会减少客户端-服务器往返次数。这可能是一个巨大的改进,因为对于短查询,网络延迟通常是主要成本。

如果您的所有查询都有不同的SELECT 列表,那么您无能为力。

【讨论】:

  • 不同的表有不同的列集,所以我好像不能UNION ALL跨表查询。但是,看来我可以使用此方法将针对每个表的所有查询组合在一起。这些仍然可能是每个表的数千个查询,因此可以很好地提高效率。
  • 是的,应该可以。通过更多努力,您可以使用WHERE 条件,例如WHERE (col1, col2) IN ((val1, val2), (val3, val4), ...)。使用正确的索引可能会成为赢家。
猜你喜欢
  • 2021-01-09
  • 1970-01-01
  • 2016-05-10
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2012-03-29
相关资源
最近更新 更多