【发布时间】:2011-09-29 17:42:56
【问题描述】:
查询基本上是:
SELECT DISTINCT "my_table"."foo" from "my_table" WHERE...
假装我 100% 确定查询的 DISTINCT 部分是它运行缓慢的原因,我省略了查询的其余部分以避免混淆,因为我是不同部分的缓慢主要关注(distinct 总是缓慢的来源)。
有问题的表有 250 万行数据。 DISTINCT 需要用于此处未列出的目的(因为我不想返回修改后的查询,而只是关于使不同查询在 DBMS上运行得更快的一般信息> 级别,如果可能)。
如何在不更改 SQL 的情况下使DISTINCT 运行得更快(特别是使用 Postgres 9)(即,我无法更改传入的 SQL,但可以在数据库级别优化某些内容)?
【问题讨论】:
-
需要完整的查询才能给出答案。通常,人们出于不好的原因使用 distinct。
-
@orokusaki :查询是一回事。它不是一侧的 distinct,另一侧的 join 和第三侧的 group by。这并不是因为您的查询在没有不同的情况下会更快,因此问题是不同的......您无法回答这样的问题。或者是的,你可以:使用索引。
-
@orokusaki:这真的取决于。通常,在查询中使用 distinct 反映了某处的次优连接。并非总是如此,但足够频繁。在这种情况下,想法是重写查询,以便子语句位于返回唯一行的子查询中(或使用 in() 子句进行检查)。
-
@Denis- 在性能方面存在次优连接,但无法避免。我正在过滤 M2M 关系(获取所有在其
foos(m2m) 列表中具有 [x、y 或 z] 的用户。 -
我不知道为什么人们很难让你假设不同的是慢速部分。将查询速度降低到这样的程度相对容易。
标签: sql database postgresql database-optimization