当没有ORDERBY时,Oracle SQL如何对行进行排序



我目前已经编写了SQL,以便在不使用ORDER BY的情况下在select语句中带回数据。从我所读到的内容来看,选择似乎是随机的?当我试图对选择后应该更新的数据运行测试时,是否有一种方法可以"预测"select语句将返回哪些条目(因此应该进行修改(?我选择的语句是:

SELECT x.FIELD_A,
x.FIELD_B,
x.FIELD_C,
y.FIELD_D,
y.FIELD_E,
y.FIELD_F
FROM TABLE_X x
LEFT JOIN TABLE_Y Y ON x.FIELD_A = y.FIELD_G
WHERE y.FIELD_G in ('xxx', 'yyy', 'zzz', 'www')
AND y.FIELD_E = 'vvvv'
AND y.FIELD_G IS NULL
AND y.FIELD_H IS NULL
AND y.FIED_I IS NULL
AND x.FIELD_J IN ('uuu', 'ttt', 'sss', 'rrrr')
AND y.FIELD_K_DATE > ADD_MONTHS(SYSDATE, -12)
AND ROWNUM <= 20

当没有ORDERBY时,Oracle SQL如何对行进行排序?

它根本不订购它们。

来自Tom Kyte的一篇经典文章,并引用了他自己的书:

您应该将堆组织的表视为一个大型无序的行集合。这些行将以看似随机的顺序出现,根据所使用的其他选项(并行查询、不同的优化器模式等(,它们可能会以不同的顺序出现在同一查询中。除非查询中有ORDERBY语句,否则永远不要指望查询中的行顺序!

如果您今天多次运行查询,您可能会以相同的顺序看到相同的结果,但可能不会。你可以运行它一百次,也许每次都会得到相同的结果,并认为这意味着它总是会返回。但如果你明天再运行它,它可能会也可能不会一样。如果你在未来几周、几个月或几年内运行它,它仍然可能与你今天看到的一样,但随着其他事情的变化,包括数据量、统计数据收集、数据库升级,甚至潜在的补丁,它越来越不可能

如果没有order by子句,您将任由优化器摆布,甚至无法控制的事情,甚至可能是从磁盘读取数据块的顺序。

因此,不,您无法预测查询将返回哪些条目。你会得到20行,但你得到的是哪一行以及它们的顺序是不确定的。

如果需要可预测的结果,则需要在应用rownum筛选器(或使用fetch first(之前对结果进行排序。

最新更新