Postgres WHERE子句是按顺序运行的吗?

时间:2015-06-18 17:58:12

标签: postgresql

我正在考虑使用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

也许我在这里误解了一些东西,我很想知道你的想法!

谢谢!

2 个答案:

答案 0 :(得分:1)

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

要确定查询计划程序将如何构建给定查询,请将EXPLAIN放在其前面:

public static string CRC(this string s)
{
    var dd = s.Correct4CRC();
    var dr = dd.CreateDivisor().ToString();
    int drl = dr.Length;
    var d = dd.Substring(0, drl).CreateDivisor();
    var f = d ^ dr.CreateDivisor();
    var p = true;
    while (p)
    {
        d = dd.Substring(0, drl).CreateDivisor();
        f = d ^ dr.CreateDivisor();
        p = d > dd.CreateDivisor();
    }
    return f.ToString();
}

这将输出该查询的查询计划。请注意,空表可能会从具有(例如)10,000行的表中获得完全不同的查询计划,因此请务必测试真实(istic)数据。

答案 1 :(得分:1)

数据库引擎要复杂得多。

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

如果您想了解您的查询将如何实际解决,您可以要求引擎解释"它适合你:http://www.postgresql.org/docs/current/static/sql-explain.html

但是,请注意,有很多关于数据库引擎实际工作的技术背景,以便了解该解释的含义。