none
为何插入表格中的数据查询出来后,顺序乱了 RRS feed

  • 问题

  • 问题是这样的:创建了一个表XTXTA,有若干列,最后有一个自增列ATAD。

    往里面插入30条数据后,执行select * from  XTXTA , 得到的结果表是顺序的,从第一条到最后一条,ATAD列的值依次是1—30

    隔30分钟后,再次插入30条数据,执行执行select * from  XTXTA ,结果表中的数据ATAD的值乱了,不再是连续递增的,下一行有时候比上一行的值大,有时候小,如

    ATAD

    1

    4

    2

    3

    7

    5

    为什么会这样呢?

    没有在该表上建立任何索引。请大侠解惑,谢谢。

    2010年8月23日 7:35

答案

  • 如果不指定order by ,sql server是不保证查询结果的顺序的. 无论你是否创建了索引.
    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    2010年8月23日 8:39
    版主
  • 没有指定order by 你的返回结果集是无序的...

    http://blog.csdn.net/feixianxxx/archive/2010/01/29/5271003.aspx

    2010年8月23日 9:13
  • 楼上几位说的已经很全面了。补充一点。

    如果你的记录是变长记录,那么这种情况就很可能会出现。假定table scan没有楼上说的parallel scan,那么对没有任何索引的表,select就是按照页顺序从头读到尾。所以问题出现在于,你新插入的一些记录插入到了前面的页里面。参考下面的例子。如果列a数据类型由varchar改为char,最后的select顺序就没有问题。

    create table t3 (a varchar(2048), b int identity); 
    -- varchar改为char就没有问题
    go
    declare @i int =1;
    declare @n int =8;
    
    while @i < @n 
    begin
     insert into t3 (a) values (replicate('1',2048));
     set @i=@i+1
    end
    
    set @n = @n * 2;
    while @i < @n 
    begin
     insert into t3 (a) values (replicate('1',1024));
     set @i=@i+1
    end
    
    select * from t3;
    2010年8月24日 2:35

全部回复

  • 如果不指定order by ,sql server是不保证查询结果的顺序的. 无论你是否创建了索引.
    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    2010年8月23日 8:39
    版主
  • 没有指定order by 你的返回结果集是无序的...

    http://blog.csdn.net/feixianxxx/archive/2010/01/29/5271003.aspx

    2010年8月23日 9:13
  • 楼上几位说的已经很全面了。补充一点。

    如果你的记录是变长记录,那么这种情况就很可能会出现。假定table scan没有楼上说的parallel scan,那么对没有任何索引的表,select就是按照页顺序从头读到尾。所以问题出现在于,你新插入的一些记录插入到了前面的页里面。参考下面的例子。如果列a数据类型由varchar改为char,最后的select顺序就没有问题。

    create table t3 (a varchar(2048), b int identity); 
    -- varchar改为char就没有问题
    go
    declare @i int =1;
    declare @n int =8;
    
    while @i < @n 
    begin
     insert into t3 (a) values (replicate('1',2048));
     set @i=@i+1
    end
    
    set @n = @n * 2;
    while @i < @n 
    begin
     insert into t3 (a) values (replicate('1',1024));
     set @i=@i+1
    end
    
    select * from t3;
    2010年8月24日 2:35