此问题在此处已有答案:
Default row order in SELECT query - SQL Server 2008 vs SQL 2012(1个答案)
SQL best practice to deal with default sort order(10个答案)
SQL: What is the default Order By of queries?(4个回答)
When no 'Order by' is specified, what order does a query choose for your record set?(2个答案)
Why postgres returns unordered data in select query, after updation of row?(2个答案)
22天前关闭
x1c 0d1x的数据
$: select id from vehicles limit 5 offset 45
-- Returns
-- 735
-- 736
-- 737
-- 738
-- 739
$: select id, state from vehicles limit 5 offset 45;
-- Returns
-- 1381 | new
-- 1327 | new
-- 1304 | new
-- 1382 | new
-- 1317 | new
字符串
即使没有添加任何排序/分组,当我添加另一列“id”时,我在PostgreSQL中得到不同的记录集的原因是什么?
PostgreSQL Ver - 12.6
1条答案
按热度按时间6ovsh4lw1#
你正在使用的
Limit 5 offset 45
有效地给了你 * 意外的 * 5行,除非你添加一个order by
-没有它的顺序是 * 不 * 保证。PostgreSQL可以自由地以任何它想要的顺序获取行,并以任何它想要的顺序写入它们。即使你通过索引cluster
,强制重写一个表以遵循某个索引暗示的顺序,除非指定order by
子句,否则如何将其读回给您的选择仍然是任意的。From the doc:如果未选择排序,则将以未指定的顺序返回行。在这种情况下,实际顺序将取决于扫描和联接计划类型以及磁盘上的顺序,但不能依赖于此。只有显式选择排序步骤,才能保证特定的输出顺序。
你可能会经历 * 有序读取 * 并期望一些 * 默认排序 * 行为,但除非你使用
order by
,否则这些都是偶然的,你不能指望它们在未来保持它们的顺序。如果你所追求的实际上是某种随机的5行,但以一种可靠和稳定的方式,我不认为你可以轻松地实现这一点。你必须在cte/子查询中按所有内容排序以获得一个稳定的输入,
setseed()
,然后是order by random()
,然后才能删除limit 5 offset 45
。这类似于
tablesample
子句:字符串
即使使用
repeatable
(或setseed()
)中指定的种子,也不是真正可重复的:如果表在语句之间发生变化,您将不再获得相同的样本。