CREATE TABLE "TK"."TABLESN" (
    "YB" VARCHAR2(10), 
    "ISN" NUMBER(10),
    "TABLENAME" VARCHAR2(30),
    "IID" NUMBER(10) NOT NULL,    
    PRIMARY KEY(YB,TABLENAME,IID))  
    ORGANIZATION INDEX
    TABLESPACE "BOCLETTER01_DATA"    想实现的效果是:在向TABLESN表中插入数据时,数据按照YB字段来实现物理上的自动排序,这样写可以吗?现在碰到的问题是如果数据量少的话是可以达到目的的,但是数据量一大(一万条左右),就不是想要的效果了。不知道怎么回事?请各位大虾帮忙!谢谢

解决方案 »

  1.   

    记录在表中的顺序是可以调换的,没有order by的展现出来的排序是没有意义的
    没有物理上的自动排序
      

  2.   

    物理上的自动排序?
    什么意思?如果要按YB排序,直接order by "YB"不就行了?
      

  3.   

    用IOT不是可以实现物理上的排序吗?
      

  4.   

    我的意思是想在TableSN表中按照YB排序来产生iSN(流水号)就是在插入数据的时候,是按照YB的顺序都排好了,那样就可以直接用序列生成iSN了如果order by的话,还需要一个表呀
      

  5.   

    我在小数据量的情况下是可以实现我想要的效果的啊,插入几条数据,它是按照YB来排序的(没有用order by),但是数据量一大,就分成了好几部分
      

  6.   

    各位大虾帮帮忙啊,小弟初学Oracle,不大懂啊
      

  7.   

    就是用Oracle实现类似SQLSERVER中的聚集索引啊,在SQLserver中数据量大也没问题啊,为什么在Oracle中不行呢?
    哪里出问题了?各位帮帮忙啊!
      

  8.   

    "用IOT不是可以实现物理上的排序吗?"用IOT实现的是索引组织表,就是用索引的结构来保存表。和排序没关系。"我的意思是想在TableSN表中按照YB排序来产生iSN(流水号),就是在插入数据的时候,是按照YB的顺序都排好了,那样就可以直接用序列生成iSN了 "这里论证一下你的上述想法是不可能完成的,a、b两个进程同时插入数据,如下:
               a             b          序列生成iSN
    YB         1                            1
                             3              2
                             4              3
               2                            4插入数据之前YB的顺序是未知的,如果用序列来生成isn的话必然导致YB的顺序和isn的顺序不一致。
    个人理解你想保证iSN和YB的顺序一致,然后用iSN作为流水号?如果是这样,那么你可以直接用YB作流水号啊。提问的时候应该说明的是需求,而不是让别人来适应你的思路,因为你的思路很可能是错的(要不可能你就不用来问了)。
      

  9.   

    需求:YB字段(邮编)在插入的时候是无序的,要实现的是按照排序的YB(邮编)生成iSN(流水号);
    即:
         YB    TABLENAME   IID    iSN
      100000      T1       11      1
      200000      T1       10      2
      999999      T0       5       3
    insert into TABLESN(YB,TABLENAME,IID) VALUES('999999','T0','5')
    insert into TABLESN(YB,TABLENAME,IID) VALUES('200000','T1','11')
    insert into TABLESN(YB,TABLENAME,IID) VALUES('100000','T1','10')
    插入的顺序是:先插入999999,然后是200000,100000
    插入后就会自动按照上面的顺序存储了;
    就想按照这个顺序生成iSN但是数据量一大,就不是上面的效果了有什么好的解决方法啊?
      

  10.   

    你插入的时候自己生成iSN 
    iSN =count(*)+1
    就可以了
      

  11.   

    楼主的意思我明白了,既然这样的方式不行的话.可不可以采用别的方法实现呢?
    比如表中不需要ISN字段,在取值的时候先通过对全表order by YB 来排序SELECT 中使用row_number函数确认行号.相当于ISN字段的功能了.然后外面再嵌套SQL来完成想实现的功能查询。
    一个建议,没测试过。仅供楼主参考!
      

  12.   

    楼上言之有理,如果楼主准备在iSN上吊死的话,就按楼上说的做。
      

  13.   

    我的意思是说,如果楼主你一定要用iSN做流水号的话,那么就按楼上说的做。