在Postgres中加速慢速SELECT DISTINCT查询的解决方案

时间:2011-07-06 15:16:11

标签: sql database postgresql database-optimization

查询基本上是:

SELECT DISTINCT "my_table"."foo" from "my_table" WHERE...

假装我100%肯定查询的DISTINCT部分是它运行缓慢的原因,我省略了其余的查询以避免混淆,因为它是我的独特部分的缓慢主要关心的是(明显总是缓慢的来源)。

该表有250万行数据。此处未列出的目的需要DISTINCT (因为我不希望返回修改后的查询,而只是关于在 DBMS上更快地运行不同查询的一般信息< / em>级别,如果可能)。

如何在不改变SQL的情况下使DISTINCT更快地运行(特别是使用Postgres 9)(即,我无法改变此SQL,但是可以在数据库级别优化某些内容)?

3 个答案:

答案 0 :(得分:23)

通常情况下,您可以通过使用distinct代替group by来更快地运行此类查询:

select my_table.foo 
from my_table 
where [whatever where conditions you want]
group by foo;

答案 1 :(得分:15)

您的DISTINCT导致它对输出行进行排序以查找重复项。如果在查询选择的列上放置索引,则数据库可能能够按索引顺序读取它们并保存排序步骤。很多将取决于查询的细节和所涉及的表 - 你说“你知道问题与DISTINCT”确实限制了可用答案的范围。

答案 2 :(得分:5)

您可以尝试增加work_mem设置,具体取决于您的数据集的大小。它可能导致将查询计划切换为哈希聚合,这通常更快。

但在全球范围内设置太高之前,请先阅读它。您可以轻松炸毁您的服务器,因为max_connections设置充当此数字的乘数。

这意味着如果您设置work_mem = 128MB并设置max_connections = 100(默认值),则应该有超过12.8GB的RAM。你实际上是在告诉服务器它可以使用那么多来执行查询(甚至不考虑Postgres或其他任何其他内存使用)。