jgu*_*ink 8 sql oracle rows sql-order-by
也许有人可以向我解释这一点,但是当从Oracle查询数据表时,如果存在密钥的多个记录(比如客户ID),那么如果没有隐含的"order by",那么该客户首先出现的记录可能会有所不同.声明通过说替代字段(例如事务类型)来强制执行订单.因此,在同一个表上运行相同的查询可能会产生与10分钟前不同的记录顺序.
例如,一次运行可以产生:
Cust_ID,Transaction_Type
123 A
123 B.
除非使用"Transaction by Transaction_Type"子句,否则Oracle可以在下次运行查询时随意返回以下结果:
Cust_ID,Transaction_Type
123 B
123 A.
我想我的印象是Oracle中有一个数据库默认的行排序(可能)反映了磁盘介质上的物理排序.换句话说,任意顺序是不可变的,并且在重新运行查询时将保证相同的结果.
这是否与优化器有关,以及它如何决定最有效地检索数据的位置?
当然,编程视角下的最佳实践是强制要求任何顺序,我对这种行为感到有点不安.
Ada*_*sch 22
除非另有说明,否则从SELECT语句返回到应用程序的行的顺序是COMPLETELY ARBITRARY.如果您希望,需要或期望行以特定顺序返回,则用户有责任指定此类订单.
(警告:如果使用某些操作,某些版本的Oracle将按升序隐式排序数据,例如DISTINCT, UNION, MINUS, INTERSECT,或GROUP BY.但是,由于Oracle已实现哈希排序,因此数据类型的性质可能会有所不同,并且大量SQL依赖在那个功能上破了.)
永远没有默认订购.如果未指定ORDER BY,则可以在前10000次获得相同的结果,然后可以更改.
请注意,即使ORDER BY值相等也是如此.例如:
Col1 Col2
1 1
2 1
3 2
4 2
Run Code Online (Sandbox Code Playgroud)
如果您使用ORDER BY Col2,您仍然不知道第1行或第2行是否会先出现.
只需将表中的行像篮子中的球一样成像.球有订单吗?
如果没有指定ORDER BY ,我不认为有任何DBMS 保证订单.
有些人可能总是按照插入的顺序返回行,但这是一个实现副作用.
某些执行计划可能会导致结果集即使没有ORDER BY也会被排序,但这又是一个您不应该依赖的实现副作用.
如果ORDER BY子句不存在,则数据库(不仅仅是Oracle - 任何关系数据库)可以按照发现它们的顺序自由返回行.这取决于优化程序选择的查询计划.
如果返回行的顺序很重要,则必须使用ORDER BY子句.你有时可能会很幸运,即使没有ORDER BY,行也会按照你希望它们的顺序返回,但是不能保证A)你会在其他查询中获胜,而B)行的顺序明天返回将与他们今天返回的顺序相同.
此外,对数据库产品的更新可能会更改查询的行为.去年进行主要版本升级时我们不得不争先恐后,因为我们发现Oracle 10以不同于Oracle 9的顺序返回GROUP BY结果.原因 - 没有ORDER BY子句.
ORDER BY - 当返回数据的顺序真正重要时.
简单的答案是SQL标准说没有ORDER BY语句的查询没有默认顺序,所以你永远不应该假设一个.
真正的原因可能与分配给每一行的哈希值有关,因为它被拉入记录集.没有理由假设一致的散列.