首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Postgres中加速慢速SELECT DISTINCT查询的解决方案

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

Stack Overflow用户
提问于 2011-07-06 23:16:11
回答 3查看 86.9K关注 0票数 37

查询基本上是:

代码语言:javascript
复制
SELECT DISTINCT "my_table"."foo" from "my_table" WHERE...

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

有问题的表有250万行数据。这里没有列出的目的需要DISTINCT (因为我不想返回修改过的查询,如果可能的话,我只想返回有关在DBMS级更快地运行distinct查询的一般信息)。

我怎样才能让DISTINCT运行得更快(特别是使用postgres9)而不改变SQL (也就是,我不能改变这个SQL,但有权在DB级优化一些东西)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-06 23:29:04

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

票数 28
EN

Stack Overflow用户

发布于 2011-07-06 23:25:54

通常,您可以通过使用group by绕过distinct来更快地运行此类查询:

代码语言:javascript
复制
select my_table.foo 
from my_table 
where [whatever where conditions you want]
group by foo;
票数 46
EN

Stack Overflow用户

发布于 2011-07-08 08:40:24

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

但在全局设置得太高之前,首先要仔细阅读它。您可以很容易地炸毁您的服务器,因为max_connections设置相当于这个数字的乘数。

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6598778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档