2011-05-04 33 views
1

嗯,我有一个按ID排序表,但我想检索n行偏移m行,但是当我使用它没有orderby它正在产生不可预知的结果,并通过ID顺序它需要太多的时间,因为我的表已经排序,我只想检索n行,留下第m行。限制和偏移量在sql中的问题?

+7

*因为我的表已经订购*。一张表是无序的一组行。除非您指定Order By,否则数据库不能保证行的种类。因此,没有“我的餐桌已经订购”的概念。你不能假定,当你查询你的表时,即使给定了相同的查询,它也会按照特定的顺序,除非你使用了Order By。 – Thomas 2011-05-04 19:10:27

回答

1
SELECT * FROM mytable LIMIT 100 OFFSET 0 

尽管如此,您确实不应该依赖隐式排序,因为您可能无法预测数据如何进入数据库的确切顺序。

1

如上所述,除非您有ORDER BY子句,否则SQL不保证顺序。在这种情况下LIMIT仍然有用,但我想不出任何用于OFFSET的情况。这听起来像你没有索引ID,因为如果你这样做,查询应该是非常快,聚类或不。再看看那个。 (另请检查CLUSTER,这可能会提高您的性能。)

REPEAT:这不是关于Postgresql的。它在这里的行为是一致的。

2

documentation说:

的查询规划考虑LIMIT生成查询规划的时候,所以你很可能得到不同的规划(产生不同的行顺序),这取决于你用什么LIMIT和抵消。因此,使用不同的LIMIT/OFFSET值来选择查询结果的不同子集将导致不一致的结果,除非您使用ORDER BY强制执行可预测的结果排序。这不是一个错误;这是事实的一个内在结果,即SQL不承诺以任何特定顺序传递查询的结果,除非ORDER BY用于约束订单。

所以你正在尝试不能真正做到。

我想你可以玩规划选项或者以一种聪明的方式重新排列查询来诱使规划人员使用适合你的计划,但实际上不显示查询,这很难说。