Postgresql Postgres子句是否按顺序运行?

Postgresql Postgres子句是否按顺序运行?,postgresql,Postgresql,我正在考虑使用Postgres作为数据库,让我们的客户细分他们的客户 其思想是,他们可以在前端管理中选择一组条件,这些条件将映射到SQL查询。现在,我想最好的结构应该是这样的: SELECT DISTINCT id FROM users WHERE id IN ( -- condition 1 ) AND id IN ( -- condition 2 ) AND id IN ( -- etc ) 效率和查询速度对我们来说非常重要,我想知道这是否是构建事物的最佳方式。当检查每个

我正在考虑使用Postgres作为数据库,让我们的客户细分他们的客户

其思想是,他们可以在前端管理中选择一组条件,这些条件将映射到SQL查询。现在,我想最好的结构应该是这样的:

SELECT DISTINCT id FROM users

WHERE id IN (
  -- condition 1
)

AND id IN (
  -- condition 2
)

AND id IN (
  -- etc
)
效率和查询速度对我们来说非常重要,我想知道这是否是构建事物的最佳方式。当检查每个
WHERE
子句时,Postgres会将
id
值从一个传递到下一个吗

理想的情况是,对于100万用户群体:

  • 查询1过滤到100k
  • 查询2从100k筛选到10k
  • 查询3筛选到10k到5k
与之相反:

  • 查询1个从1m到100k的过滤器
  • 查询2过滤器从1m降到50k
  • 查询3过滤器从1m降至80k
  • 所有查询的交集都混合在一起,达到5k
也许我误解了什么,我想听听你的想法


谢谢

Postgres使用查询计划器来找出如何最有效地应用您的查询。它可以根据在后台定期收集的统计信息重新排序或更改某些查询操作(如联接)的实现方式

要确定查询计划器将如何构造给定的查询,请在查询前进行解释:

EXPLAIN SELECT DISTINCT id FROM users ...;

这将输出该查询的查询计划。请注意,空表可能会从(比如)10000行的表中获得完全不同的查询计划,因此一定要对真实(ISIC)数据进行测试。

数据库引擎比这复杂得多

条件的具体顺序应该无关紧要。他们将把您的查询作为一个整体,并根据您指定的所有条件、每个表的索引、每个条件将过滤掉的记录量等,尝试找出获取数据的最佳方法

如果您想了解如何实际解决查询,可以让引擎为您“解释”:


但是,请注意,为了理解这一解释的含义,有很多关于DB引擎实际工作的技术背景。

如果效率对您很重要,请不要在列表中使用大的
。使用
存在(…)
子查询或联接;DR回答问题:“否”,当然,如果您想要计时和行数,请解释分析