向表插入记录的顺序和读取记录的次序一样吗??

向表插入记录的顺序和读取记录的次序一样吗?? [问题点数:30分,结帖人wh62592855]

右鞋左穿

Bbs6

结帖率 100%

SQL code?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

SQL> create table t22(id number,name varchar2(20) primary key);

 

Table created.

 

SQL> insert into t22 values(2,'ha');

 

1 row created.

 

SQL> insert into t22 values(1,'wa');

 

1 row created.

 

SQL> insert into t22 values(3,'ya');

 

1 row created.

 

SQL> insert into t22 values(5,'ba');

 

1 row created.

 

SQL> commit;

 

Commit complete.

 

SQL> select from t22;

 

        ID NAME

---------- --------------------

         2 ha

         1 wa

         3 ya

         5 ba

SQL> select a.*,rownum from t22 a;

 

        ID NAME                     ROWNUM

---------- -------------------- ----------

         2 ha                            1

         1 wa                            2

         3 ya                            3

         5 ba                            4


如上所示 难道SELECT查询时的顺序就是插入时的顺序吗
印象中以前在什么地方看到过专门对这个问题的讲解 可是忘了

我只记得好像书上说过插入的数据不一定是顺序存储的
不过SELECT如果是顺序读取的话 那么也可能和插入数据的顺序不一样

可能我这里数据量太小 数据库活动也不频繁 所以看起来好像查询时的顺序和插入时的顺序一样吧

呵呵 我怎么感觉有点绕 绕口令一样

问题点数:30分

 0 2009-11-09 18:31:14

回复数 22 只看楼主 引用 举报 楼主

ACMAIN_CHM

Bbs5 版主

Blank Blank Blank Blank

不一样。表中的记录是没有顺序的! 虽然在ORACLE中其实还有一个rowid.

但物理上,ORACLE会根据块中的记录情况来自行安排存储的位置。比如 你有 1-100记录,此时删除了10-50,当再次插入记录 101时,它会把这条记录放到原来 10 的那个segment 中去。

0 2009-11-09 18:44:08

只看TA 引用 举报 #1    得分 10

右鞋左穿

Bbs6

恩 谢谢
我知道
你说的是存储的顺序和插入的顺序么

我这里问的是插入的顺序和SELECT查询时读出数据的顺序

0 2009-11-09 19:05:09

只看TA 引用 举报 #2    得分 0

gisyellow

Bbs2

楼主自己试试不就知道了?

0 2009-11-09 22:14:20

只看TA 引用 举报 #3    得分 0

右鞋左穿

Bbs6

我前面不是试过了吗

不过有些问题不是一个简单的测试就能说明的了的

0 2009-11-09 22:16:14

只看TA 引用 举报 #4    得分 0

hebo2005

Bbs7

Blank Blank

新的数据库是顺序的,不过经常有删除插入等动作的话,就是不顺序了
这就是为什么有人认为ORACLE有默认排序的道理

0 2009-11-09 22:21:46

只看TA 引用 举报 #5    得分 0

右鞋左穿

Bbs6

呵呵 看来是我没把问题描述清楚 我换个方式问吧

比如说表TEST里 
插入数据的顺序为 1、3、2、4、5
那么SELECT出来的顺序一定是13245吗

如果是13245的话 那么继续下面的问题
假如过程中删了3 插入了6 
而且碰巧6插入在了被删除的3的位置上
那么这个时候SELECT的顺序是什么
16245?  12456?

0 2009-11-09 22:35:13

只看TA 引用 举报 #6    得分 0

右鞋左穿

Bbs6

引用 5 楼 hebo2005 的回复:

新的数据库是顺序的,不过经常有删除插入等动作的话,就是不顺序了
这就是为什么有人认为ORACLE有默认排序的道理

 呵呵 我就是刚才在看你在开发版块发的那个帖子的时候想到这个问题的

0 2009-11-09 22:35:43

只看TA 引用 举报 #7    得分 0

xanaduwpz

Bbs3

ORACLE默认是怎么排序的呀?

0 2009-11-10 08:37:27

只看TA 引用 举报 #8    得分 0

iqlife

Bbs8

Blank Blank Blank

无顺序

0 2009-11-10 08:43:52

只看TA 引用 举报 #9    得分 0

hfxk1983

Bbs1

我的试验结果是12456,这就是说默认的SELECT出来的顺序就是插入的先后顺序?关注一下。

引用 6 楼 wh62592855 的回复:

呵呵 看来是我没把问题描述清楚 我换个方式问吧

比如说表TEST里
插入数据的顺序为 1、3、2、4、5
那么SELECT出来的顺序一定是13245吗

如果是13245的话 那么继续下面的问题
假如过程中删了3 插入了6
而且碰巧6插入在了被删除的3的位置上
那么这个时候SELECT的顺序是什么
16245?  12456?

0 2009-11-10 09:18:40

只看TA 引用 举报 #10    得分 0

天上的小星星 在夜里很美丽

Bbs5

引用 6 楼 wh62592855 的回复:

呵呵 看来是我没把问题描述清楚 我换个方式问吧

比如说表TEST里
插入数据的顺序为 1、3、2、4、5
那么SELECT出来的顺序一定是13245吗

如果是13245的话 那么继续下面的问题
假如过程中删了3 插入了6
而且碰巧6插入在了被删除的3的位置上
那么这个时候SELECT的顺序是什么
16245?  12456?


1.一定是13245
2.12456
个人观点 呵呵  
我认为插入的顺序与select的顺序是一致的(在没有任何order by的情况下)

0 2009-11-10 09:36:24

只看TA 引用 举报 #11    得分 0

dgdgdgdgdgdgd

Bbs1

比如说表TEST里 
插入数据的顺序为 1、3、2、4、5 
那么SELECT出来的顺序一定是13245吗 

如果是13245的话 那么继续下面的问题 
假如过程中删了3 插入了6 
而且碰巧6插入在了被删除的3的位置上 
那么这个时候SELECT的顺序是什么 

0 2009-11-10 09:37:30

只看TA 引用 举报 #12    得分 0

dgdgdgdgdgdgd

Bbs1

假如过程中删了3 插入了6
如果是13245的话 那么继续下面的问题

0 2009-11-10 09:38:01

只看TA 引用 举报 #13    得分 0

dgdgdgdgdgdgd

Bbs1

新的数据库是顺序的,不过经常有删除插入等动作的话,就是不顺序了 
这就是为什么有人认为ORACLE有默认排序的道理 

0 2009-11-10 09:38:22

只看TA 引用 举报 #14    得分 0

轻骑兵

Bbs1

在不使用order by字句时,oracle不会给你做任何排序的操作。

很多人认为是按rowid排序,实际上并不是如此。实际上oracle不做任何操作(如果未使用rowid)

楼主这个例子只是碰巧而已,并不能说明任何问题(虽然很多情况都是感觉到是按rowid这样)。

oracle进行插入时也不是说后插入的记录的rowid一定比先插入的记录的rowid大,这是无稽之谈。它插入记录时是检查个表看是否有空间插入,如果无,则新的rowid。

0 2009-11-10 09:55:51

只看TA 引用 举报 #15    得分 10

轻骑兵

Bbs1

很多人认为是按rowid排序,实际上并不是如此。实际上oracle不做任何操作(如果未使用rowid) 

--这句括号内写错了,应该是  (如果未使用order by)

0 2009-11-10 09:56:47

只看TA 引用 举报 #16    得分 0

右鞋左穿

Bbs6

呵呵 一夜之间这么多人回帖啊 谢谢大家哈

回答这个问题我觉得首先得搞明白三点
1、向表中插入数据的顺序
2、数据在ORACLE中实际存储的顺序
3、使用SELECT(无ORDER BY子句)检索出来数据的顺序

从1和3来考虑
从前面简单的实验来看 好像向表中插入数据的顺序就是使用SELECT检索出来数据的顺序(可是往往有些问题并不是一个简单的实验九能够证明的了的)

把1、3结合上2一起考虑一下
考虑一下ORACLE存储的顺序 我们都知道 在ORACLE不一定先插入的数据就一定排在前面 因为当新插入一条记录的时候 ORACLE会自动查找空闲空间 这个时候有可能后插入的记录反而存储在早插入记录的前面
比如说上面说的那种情况:
插入顺序是13245
过程中删了3 插入了6 
而且碰巧6插入在了被删除的3的位置上 
这个时候存储的顺序就应该是16245

好 那接下来就是SELECT检索数据的顺序了 我印象中好像ORACLE读取数据是顺序读取的吧(如果我没记错的话??) 那么这个时候就应该读取出来的顺序是16245(因为存储的顺序是16245 而又是顺序读取)
这样的话就和上面的观点“读取顺序和插入顺序一样”这个观点矛盾了哦 呵呵 因为如果按照前面的观点的话结果应该为12456

好饿 ~ 吃点早餐  

0 2009-11-10 10:23:10

只看TA 引用 举报 #17    得分 0

右鞋左穿

Bbs6

怎么没人跟帖了了

顶起来

0 2009-11-10 19:03:45

只看TA 引用 举报 #18    得分 0

huangyunzeng2008

Bbs4

通过测试发现好像不经过order的话,select出来的顺序是随机的。
create table t_a(col_1 varchar2(1),col_2 varchar2(1));
----------------------------------
INSERT INTO t_a VALUES('2','2');
INSERT INTO t_a VALUES ('0','0');
INSERT INTO t_a VALUES('1','1');
COMMIT;
SELECT * FROM t_a;
此时得到的结果顺序是: 2,0,1
-----------------------------------
DELETE FROM t_a WHERE NAME='0';
COMMIT;
INSERT INTO t_a VALUES('3','3');
COMMIT;
SELECT * FROM t_a;
此时得到的顺序是 :2,1,3
-------------------------------
DELETE FROM t_a WHERE NAME='3' ;
COMMIT;
INSERT INTO t_a VALUES('3','3');
COMMIT;
SELECT *FROM t_a;
如果按生成顺序得到select的顺序的话应该是 2,1,3,但是此时得到的结果是 :2,3,1
--------------------------------
综上所述得到:select的顺序跟插入顺序是没有关系的。

0 2009-11-10 19:36:44

只看TA 引用 举报 #19    得分 10

右鞋左穿

Bbs6

呵呵 不容易呀 
终于试出来不同的结果了啊
我也做过和你一样的实验
不过结果是SELECT顺序和插入顺序一样

没得出你的这种结果

0 2009-11-10 20:21:11

只看TA 引用 举报 #20    得分 0

archwuke1

Bbs4

这个有意义吗

以前用foxpro的时候,数据的插入是有顺序的
后来转到sqlserver这些大型的数据库后,教材里都是一直强调缺省的顺序无意义也不可靠

0 2009-11-10 20:59:54

只看TA 引用 举报 #21    得分 0

碧水幽幽泉

Bbs7 版主

Blank Blank Blank Blank

学习中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值