我觉得序列好,“select max(ID) from 表 然后加1”...
每次都要全表扫描,表越大速度越慢.

解决方案 »

  1.   

    如果不考虑移植到其他类型的数据库,还是用序列简单。用select max()...存在并发问题,可能多个会话同时取到相同的值,插入时会出错。
      

  2.   

    序列,无论从效率还是并发角度考虑,都比 max() 强。
      

  3.   

    首先感谢各位大虾的支持
    但是有个公司的高手说序列不好,会产生乱码,select max()速度不比序列慢,他们一般用select max()或者自己建一个表来维护其它表中主键的最大值,
    人家也是权威,没办法,所以希望各位有经验的大虾多说说具体的理由和优缺点!!!
      

  4.   

    如果在ID上建有索引,则select max(ID)速会很快,
    而且自己建一个表来维护其它表中主键的最大值(而不是直接select max())也能很好地解决并发问题(可以写触发器,执行select max()时update id=id+1),至于哪个更快,偶就说不清,期待高手解答
      

  5.   

    如果用max函数可以做到比序列更好的效果,那还要序列做什么呢?
    个人认为序列要好些,简单。
    当然,具体情况也要具体分析,也许在特定的情况下会有不同的结果
      

  6.   

    简单的序列和简单的max应用都有他的优点和缺陷。
    序列:效率高,使用简单。可移植性差。
    max:效率慢,但是有一定的可移植性。
    一般对可移植有要求的都用max(但是不是简单的用),比如用一张表保留每个表要用的序列最大值。
    这样解决了效率也解决了可移植性
      

  7.   

    希望大家不用考虑可移植性的问题,目前做的系统只考虑oracle数据库上使用,
    各位大虾多多指教!!!
      

  8.   

    如果要考虑可移植性的问题的话。那么你用max还是好一些的。因为其他的数据库比如mysql,mssql可能就无法支持oracle 中的序列了。如果你的系统仅仅是基于oracle的话。我认为用序列的性能高于max产生的数值。正如njhart2003() 兄所说的。如果将来随着该表数据量的增加。会引发很多不必要的fts且序列还有cache功能。也就是说可以序存部分的数据供直接调用。
      

  9.   

    大型oracle数据库实际使用中间表(很好地解决Begin_Id,End_Id)
    维护问题能很好地解决的问题:
    1、(Begin_Id and End_Id 中间有非排序,要解决排序);
    2、序列有混和型:A1、A2...An;
    3、序列和非序列型:出现于工序流程;
    (2、3非纯序列问题)
    单表单用(非关系表);简单的序列有他的优点;
    触发器(关系表中排序):12种触发,也有他的优点(移植时compile);序列不好,会产生乱码?
    移植时rowid?...?请惠子指之!
      

  10.   

    使用序列, 可以加快处理速度, 因为序列在使用的过程中,会自动地将接下来的一部分序列值放到缓存中, 这样加快序列的读取速度, 但是,当系统重新启动后, 序列又会加载一部分值到缓存中,原来没有用的值就会消失,这样会产生跳号的情况. 而select max(id),要从表中查询,这样会减慢处理速度. 单表的ID一定要求不要有跳号的情况发生时,使用select max(id),否则使用sequence.
      

  11.   

    简单使用select max(ID)还必须确保记录只是增加,没有删除,或者是不可能删除ID最大的记录,如果不是这样,那么会可能出现同一个ID代表两个不同记录(只有一个是当前表中存在的,其他是已删除的记录),这样就有歧异。
      

  12.   

    我认为,讨论max()的性能问题在这里不是最重要的。
    select max()最大的问题,就是多用户并发,会产生重复的问题。尤其在一个需要一定时间的transaction。如果大家有兴趣可以模拟以下。
    因此,序列号是最好的选择。
    在SQL Server中有一个identity也就是为了解决这个问题。
      

  13.   

    bobfang(匆匆过客) 说地很好,看来max()在实际商业系统中,作为序列号产生使用是很不恰当的。
      

  14.   

    个人觉得用序列好,特别在多用户下,保证了唯一性。在数据比较多的情况呀,性能也是比select max()好的。
      

  15.   

    支持enhydraboy(乱舞的浮尘) 的意见
      

  16.   

    这个主要是看业务需求! 如果要保持单号的连序,必须要MAX+1
      

  17.   

    to Tongls(编程杀手)
       奇怪,什么叫单号的连序,难道MAX+1就不会跳号么??
      

  18.   

    ! 当然是序列好了,序列每次都是从缓存里取出来用的,比如建立序列的时候就直接将固定数目的序列建立在CACHE 中,比如是 ...MINVALUE 1 NOCYCLE CACHE 20 NOORDER ,这样,在调用的时候oracle每次都会将20个记录写入cache,用完20个后在调20个载入cache,性能当让要比直接写入内存的max函数要多多了
      

  19.   

    在Oracle上当然用序列最好,不存在效率问题,
    而随着表记录的增加,max(id)+1会带来性能方面的问题。
    如果还要考虑移植的话,不防使用中间序号表的方式。