多情的匕首 · 蛋白质未来简史|我们为什么要关注这场学术会议?· 12 月前 · |
刚毅的针织衫 · 如何清除Oracle.ManagedData ...· 1 年前 · |
千杯不醉的烈马 · excel用宏粘贴数据 - 抖音· 1 年前 · |
讲道义的猴子 · MySQL 性能:使用 ...· 1 年前 · |
查询基本上是:
SELECT DISTINCT "my_table"."foo" from "my_table" WHERE...
我假装100%确定查询的
DISTINCT
部分是它运行缓慢的原因,为了避免混淆,我省略了查询的其余部分,因为我主要关心的是distinct部分的缓慢(distinct总是缓慢的来源)。
有问题的表有250万行数据。这里没有列出的目的需要
DISTINCT
(因为我不想返回修改过的查询,如果可能的话,我只想返回有关在DBMS级更快地运行distinct查询的一般信息)。
我怎样才能让
DISTINCT
运行得更快(特别是使用postgres9)而不改变SQL (也就是,我不能改变这个SQL,但有权在DB级优化一些东西)?
发布于 2011-07-06 23:29:04
您的DISTINCT会导致它对输出行进行排序,以便查找重复项。如果将索引放在查询所选的列上,则数据库可能能够按索引顺序读出它们并保存排序步骤。这在很大程度上取决于查询的细节和所涉及的表--您所说的“知道问题出在DISTINCT”确实限制了可用答案的范围。
发布于 2011-07-06 23:25:54
通常,您可以通过使用
group by
绕过
distinct
来更快地运行此类查询:
select my_table.foo
from my_table
where [whatever where conditions you want]
group by foo;
发布于 2011-07-08 08:40:24
您可以尝试增加work_mem设置,具体取决于数据集的大小,这可能会导致将查询计划切换为散列聚合,后者通常会更快。
但在全局设置得太高之前,首先要仔细阅读它。您可以很容易地炸毁您的服务器,因为
max_connections
设置相当于这个数字的乘数。
这意味着,如果您设置了
work_mem = 128MB
并设置了
max_connections = 100
(默认值),那么您应该有超过12.8 of的内存。您实际上是在告诉服务器,它可以使用这些内存来执行查询(甚至不考虑Postgres或其他方面使用的任何其他内存)。
https://stackoverflow.com/questions/6598778
复制Copyright © 2013 - 2024 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有