查询基本上是:
SELECT DISTINCT "my_table"."foo" from "my_table" WHERE...
假装我100%肯定查询的DISTINCT
部分是它运行缓慢的原因,我省略了其余的查询以避免混淆,因为它是我的独特部分的缓慢主要关心的是(明显总是缓慢的来源)。
该表有250万行数据。此处未列出的目的需要DISTINCT
(因为我不希望返回修改后的查询,而只是关于在 DBMS上更快地运行不同查询的一般信息< / em>级别,如果可能)。
如何在不改变SQL的情况下使DISTINCT
更快地运行(特别是使用Postgres 9)(即,我无法改变此SQL,但是可以在数据库级别优化某些内容)?
答案 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或其他任何其他内存使用)。