存储按Oracle DB中的主键数据排序

时间:2016-10-14 14:30:01

标签: sql oracle oracle11g

应用程序适用于测试服务器和生产服务器,两者都与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使用增量序列生成,因此稍后创建的实体应显示在表的末尾。

2 个答案:

答案 0 :(得分:4)

表中的数据不按顺序存储。如果不向查询添加ORDER BY,数据库将以最快的方式从磁盘/存储中读取行,从表中返回行,这不能保证它们按排序顺序返回。

第一台服务器上的查询返回的数据可能已经存在于缓冲区缓存中,由之前运行的ORDER BY查询返回。

当您发出缺少ORDER BY的查询时,引擎决定从缓冲区缓存中提取数据而不是返回磁盘,这就是为什么它们出现"顺序" 34。

答案 1 :(得分:1)

如果要在直接查询表时有数据顺序,可以使用IOT(索引组织表),但这可能会影响性能,具体取决于表的宽度。堆表的干净解决方案是使用ORDER BY子句。