我有一个按ID排序的表格,我想要检索n行偏移m行,但是当我使用它而没有orderby时它会产生不可预测的结果,并且按ID排序会花费太多时间,因为我的表格是已订购,我只想检索n行,留下前m行。
答案 0 :(得分:2)
查询计划程序在生成查询计划时会考虑LIMIT,因此您很可能会获得不同的计划(产生不同的行顺序),具体取决于您对LIMIT和OFFSET使用的内容。因此,使用不同的LIMIT / OFFSET值来选择查询结果的不同子集将产生不一致的结果,除非您使用ORDER BY强制执行可预测的结果排序。这不是一个bug;这是SQL不承诺以任何特定顺序传递查询结果这一事实的固有后果,除非使用ORDER BY约束订单。
所以你正在尝试的东西无法真正完成。
我想您可以使用计划程序选项或以巧妙的方式重新排列查询,以欺骗计划员使用适合您的计划,但实际上没有显示查询,很难说。
答案 1 :(得分:1)
SELECT * FROM mytable LIMIT 100 OFFSET 0
你真的不应该依赖隐式排序,因为你可能无法预测数据进入数据库的确切顺序。
答案 2 :(得分:1)
如上所述,除非您有ORDER BY子句,否则SQL不保证任何有关订单的信息。 LIMIT在这种情况下仍然有用,但我想不出OFFSET的任何用途。听起来你没有id的索引,因为如果你这样做,查询应该非常快,集群或不集中。再看一下。 (另请检查CLUSTER,这可能会提高您的保证金。)
REPEAT:这不是关于Postgresql的。它的行为符合要求。