postgresql POSTGRES:添加新列时获取不同的记录集[重复]

6za6bjd0  于 5个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(52)

此问题在此处已有答案

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

6ovsh4lw

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子句:

select id, state 
from vehicles tablesample system(1) repeatable(.2) 
limit 5 offset 45;

字符串
即使使用repeatable(或setseed())中指定的种子,也不是真正可重复的:如果表在语句之间发生变化,您将不再获得相同的样本。

相关问题