PostgreSQL-查询表中的所有时间序列行

时间:2018-09-05 22:57:12

标签: postgresql timescaledb

SELECT * FROM table_1 ORDER BY time;

以上查询将查询位于table_1的所有行,同时按列time对所有行进行排序。但是,如果表的大小达到数百万行,则通过添加ORDER BY time来获取表中的所有行将效率很低。但是,幸运的是,我拥有的表是使用TimescaleDB扩展名的时间序列表,所有行均按及时顺序插入。

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

我是否只删除ORDER BY time?如果删除此选项,是否可以确定查询结果始终按time的顺序排列?

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

1 个答案:

答案 0 :(得分:0)

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

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

这导致您对PostgreSQL和获取所有行的问题。当查询的大部分表将被击中时,PostgreSQL利用并行顺序扫描。尽管这将比单次顺序扫描产生更好的性能,但是它仍然不如索引扫描提取同一数据表的数据快。

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