应用程序适用于测试服务器和生产服务器,两者都与Oracle 11g DB集成。
我注意到在表中存储数据时测试服务器上有一些排序:
SELECT * FROM table1:
|ID-PK| FK1 |name|
| 100 | 50 | a1 |
| 101 | 50 | a2 |
| 102 | 50 | a3 |
当我在另一台DB服务器上对同一个表执行相同的查询时,我得到了一些无序结果:
SELECT * FROM table1:
|ID-PK| FK1 |name|
| 102 | 50 | a3 |
| 100 | 50 | a1 |
| 101 | 50 | a2 |
如何强制按PK排序的第二个DB存储数据?
插入的实体由Java Web应用程序(使用JPA)创建,PK使用增量序列生成,因此稍后创建的实体应显示在表的末尾。
答案 0 :(得分:4)
表中的数据不按顺序存储。如果不向查询添加ORDER BY
,数据库将以最快的方式从磁盘/存储中读取行,从表中返回行,这不能保证它们按排序顺序返回。
第一台服务器上的查询返回的数据可能已经存在于缓冲区缓存中,由之前运行的ORDER BY
查询返回。
当您发出缺少ORDER BY
的查询时,引擎决定从缓冲区缓存中提取数据而不是返回磁盘,这就是为什么它们出现"顺序" 34。
答案 1 :(得分:1)
如果要在直接查询表时有数据顺序,可以使用IOT(索引组织表),但这可能会影响性能,具体取决于表的宽度。堆表的干净解决方案是使用ORDER BY子句。