我正在考虑使用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万用户来说,理想的情况是:
相反:
也许我在这里误解了一些东西,我很想知道你的想法!
谢谢!
答案 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
但是,请注意,有很多关于数据库引擎实际工作的技术背景,以便了解该解释的含义。