【问题标题】:Postgresql - Query all time-series rows in a tablePostgresql - 查询表中的所有时间序列行
【发布时间】:2018-09-05 22:57:12
【问题描述】:
SELECT * FROM table_1 ORDER BY time;

上述查询将查询位于table_1 中的所有行,同时按列time 对所有行进行排序。但是,如果表的大小达到数百万行,那么在添加ORDER BY time 后,获取表中的所有行将是低效的。不过幸运的是,我的表是一个使用TimescaleDB 扩展的时间序列表,并且所有行都按时插入。

在这种情况下,在确保结果查询按time 排序的同时获取表中所有内容的最有效方法是什么?

我只是删除ORDER BY time 吗?如果我删除它,我可以确定生成的查询将始终按time 的顺序排列吗?

另外,我听说 PostgreSQL 在获取表中的所有行时存在一些驱动程序问题,因为它针对查询表中的一小部分数据进行了优化。如何优化性能?

【问题讨论】:

    标签: postgresql timescaledb


    【解决方案1】:

    如果不使用显式的ORDER BY 子句,就无法确保SELECT 语句返回的数据集的顺序;即使数据以有序的方式存储在表中也是如此。如果您必须对数据进行排序,定义ORDER BY 子句是最安全的。

    针对TimescaleDB Hypertable 运行SELECT * 不会有效率。 TimescaleDB 将数据以块的形式存储在超表中,其想法是您对查询进行时间限制,以使其命中单个特定块,从而获得最佳性能。当您运行一个必须命中表中所有记录的查询时,它现在必须查看所有块中包含的所有数据,而做到这一点的唯一方法是通过顺序扫描。

    这会引出您对 PostgreSQL 和获取所有行的问题。当表的大部分将被查询命中时,PostgreSQL 会利用并行顺序扫描。虽然这将产生比单次顺序扫描更好的性能,但它仍然不会像索引扫描提取数据子集针对同一个表那样快。

    需要查询表中所有行的原因是什么?由于任何 SQL 引擎都必须至少查看每一行一次以确保返回所有行,SELECT * 永远无法利用与散列相关的查找优势和索引。

    【讨论】:

      猜你喜欢
      • 2019-01-27
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多