【问题标题】:Speed up select distinct PostGreSQL query加快选择不同的 PostGreSQL 查询
【发布时间】:2012-11-22 00:31:37
【问题描述】:

我有一个网络日志列表。每行都有一个时间戳,我需要提取不同的时间戳,以便我可以将它们用于以后的查询。目前我正在使用以下查询:

select distinct time from metastatus

现在我首先要确认select distinct 查询返回排序值?

其次,我已经创建了数据库用于上述查询的时间索引。

最后我确实考虑过检索所有时间,然后通过我的代码找到唯一值,但是我无法检索所有时间 (160,000,000) 的值太多。

谢谢, 詹姆斯

【问题讨论】:

  • 我目前正在运行查询以按时间索引对数据库进行集群,即cluster metastatus using timeindex
  • 选择不同的值并不能保证排序的值,您需要在最后进行排序。优化器可能决定对值进行排序以生成不同的列表,但这不是它的唯一方法。
  • 谢谢,我有 order by 但我删除了它,因为我看到它返回有序值并假设它每次都这样做。我会把它放回去。

标签: sql postgresql distinct


【解决方案1】:

PostgreSQL 使用的获取DISTINCT 值的常用方法是对行进行排序,然后选择每组中的第一个。这就是为什么你通常会得到一个排序的结果,但 Postgres 对顺序没有任何断言。只需添加一个与DISTINCT 子句一致的ORDER BY。无论如何,从文档的角度来看它会更好。通常不会花费任何额外费用。请与EXPLAIN ANALYZE 确认。

在 Postgres 之外检索所有行并排序的想法是无稽之谈。这甚至不可能接近针对此类任务进行了优化的 RBDMS 的性能。您还会通过电线传输相当多的噪音。考虑一下related question 下的答案。

【讨论】:

  • 我了解 SQL 查询的性能可能比我编写的用于对行进行排序的任何代码都要好。无论如何,我都没有通过我的代码来做这件事,因为行太多,而且正如你所说,它可能会更慢。我只是想尝试这两种方法来比较时间,这是我提到它的唯一原因,但这是不可能的。
  • 这是个坏建议。大表上的 order by 性能可能比 select distinct 查询更差。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 2012-03-05
  • 1970-01-01
  • 2017-04-30
  • 2015-09-14
  • 2014-11-05
相关资源
最近更新 更多