SELECT * FROM table_1 ORDER BY time;
以上查询将查询位于table_1
的所有行,同时按列time
对所有行进行排序。但是,如果表的大小达到数百万行,则通过添加ORDER BY time
来获取表中的所有行将效率很低。但是,幸运的是,我拥有的表是使用TimescaleDB
扩展名的时间序列表,所有行均按及时顺序插入。
在这种情况下,在确保表time
对结果查询进行排序的同时,获取表中所有内容的最有效方法是什么?
我是否只删除ORDER BY time
?如果删除此选项,是否可以确定查询结果始终按time
的顺序排列?
此外,我听说PostgreSQL在获取表中的所有行时存在一些驱动程序问题,因为PostgreSQL已针对查询表中的一小部分数据进行了优化。如何优化性能?
答案 0 :(得分:0)
如果不使用显式的SELECT
子句,则无法确保ORDER BY
语句返回的数据集的顺序;即使数据以有序方式存储在表中也是如此。如果必须对数据进行排序,那么定义ORDER BY
子句是最安全的。
针对SELECT *
Hypertable运行TimescaleDB
效率不高。 TimescaleDB
将数据存储在一个超表中的多个块中,其想法是对查询进行时间限制,使其命中单个特定的块,从而实现最佳性能。现在,当您运行必须击中表中所有记录的查询时,它必须查看所有块中包含的所有数据,而唯一的方法是通过顺序扫描。
这导致您对PostgreSQL和获取所有行的问题。当查询的大部分表将被击中时,PostgreSQL利用并行顺序扫描。尽管这将比单次顺序扫描产生更好的性能,但是它仍然不如索引扫描提取同一数据表的数据快。
需要查询表中的所有行的原因是什么?由于任何SQL引擎都必须至少查看每行一次以确保返回所有行,所以SELECT *
永远不可能利用与以下内容相关的查找优势哈希和索引。