1
SELECT * FROM table_1 ORDER BY time;

上面的查询将查询所有行table_1,同时按列对所有行进行排序time。但是,如果表的大小达到数百万行,那么在添加ORDER BY time. 不过幸运的是,我的表是一个使用TimescaleDB扩展的时序表,所有行都按时插入。

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

我只是删除ORDER BY time吗?如果我删除它,我可以确定生成的查询总是按time?

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

4

1 回答 1

2

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

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

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

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

于 2018-09-06T05:35:04.080 回答