我的查询结尾有rownum >=15
当我运行此查询时,这会正确显示结果,这意味着它会逐个显示所有15行,并且所显示的行的顺序不会更改。结果的示例顺序如下:1,2,3,
但是,当我从查询中删除rownum >=15
时,结果不会按顺序1,2,3显示,而是按顺序显示结果1,3,2。
你们的任何想法都对我解决这个问题非常有帮助。
答案 0 :(得分:1)
这是许多人持久的追问。
此类行为的原因可以分析如下。
您的数据库必须处于串行模式。
Oracle文档说:
Oracle数据库以两种方式之一将数据插入表中:
串行模式:在常规INSERT 操作期间,数据库重用表中的可用空间,将新插入的数据与现有数据交错。
并行模式:在直接路径INSERT 操作期间,数据库将插入的数据追加到表中的现有数据之后。不重用现有数据中的可用空间,并忽略参照完整性约束。这些程序相结合可以提高绩效。
在传统模式下,以下记录
insert into users
values( 1, 'Elvis' ), ( 2, 'Jackson' ), ( 3, 'Madonna' );
可能导致以下存储顺序 因此,基本选择会产生相同的效果。
2 Jackson
1 Elvis
3 Madonna
在 direct-path INSERT 中,数据将附加到表的末尾,而不是使用当前分配给表的现有空间。
要强制使用直接路径INSERT ,我们使用/*+ APPEND */提示。
insert /*+ APPEND */ into users
values( 1, 'Elvis' ), ( 2, 'Jackson' ), ( 3, 'Madonna' );
此将追加表格末尾的行 因此,基本选择将按插入顺序获取记录。
1 Elvis
2 Jackson
3 Madonna
但是在选择直接路径模式之前添加的那些记录会发生什么?插入时它们存在于相同的位置。要解决此类问题,我们必须使用以下 order by 选项中的任何一个:
order by rowid
。order by user_id
在您的数据上,没有选项,只能选择合适的订购解决方案并进行检索。