序列和max函数产生主键值,哪个更好,各有什么优缺点? 我觉得序列好,“select max(ID) from 表 然后加1”...每次都要全表扫描,表越大速度越慢. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果不考虑移植到其他类型的数据库,还是用序列简单。用select max()...存在并发问题,可能多个会话同时取到相同的值,插入时会出错。 序列,无论从效率还是并发角度考虑,都比 max() 强。 首先感谢各位大虾的支持但是有个公司的高手说序列不好,会产生乱码,select max()速度不比序列慢,他们一般用select max()或者自己建一个表来维护其它表中主键的最大值,人家也是权威,没办法,所以希望各位有经验的大虾多说说具体的理由和优缺点!!! 如果在ID上建有索引,则select max(ID)速会很快,而且自己建一个表来维护其它表中主键的最大值(而不是直接select max())也能很好地解决并发问题(可以写触发器,执行select max()时update id=id+1),至于哪个更快,偶就说不清,期待高手解答 如果用max函数可以做到比序列更好的效果,那还要序列做什么呢?个人认为序列要好些,简单。当然,具体情况也要具体分析,也许在特定的情况下会有不同的结果 简单的序列和简单的max应用都有他的优点和缺陷。序列:效率高,使用简单。可移植性差。max:效率慢,但是有一定的可移植性。一般对可移植有要求的都用max(但是不是简单的用),比如用一张表保留每个表要用的序列最大值。这样解决了效率也解决了可移植性 希望大家不用考虑可移植性的问题,目前做的系统只考虑oracle数据库上使用,各位大虾多多指教!!! 如果要考虑可移植性的问题的话。那么你用max还是好一些的。因为其他的数据库比如mysql,mssql可能就无法支持oracle 中的序列了。如果你的系统仅仅是基于oracle的话。我认为用序列的性能高于max产生的数值。正如njhart2003() 兄所说的。如果将来随着该表数据量的增加。会引发很多不必要的fts且序列还有cache功能。也就是说可以序存部分的数据供直接调用。 大型oracle数据库实际使用中间表(很好地解决Begin_Id,End_Id)维护问题能很好地解决的问题:1、(Begin_Id and End_Id 中间有非排序,要解决排序);2、序列有混和型:A1、A2...An;3、序列和非序列型:出现于工序流程;(2、3非纯序列问题)单表单用(非关系表);简单的序列有他的优点;触发器(关系表中排序):12种触发,也有他的优点(移植时compile);序列不好,会产生乱码?移植时rowid?...?请惠子指之! 使用序列, 可以加快处理速度, 因为序列在使用的过程中,会自动地将接下来的一部分序列值放到缓存中, 这样加快序列的读取速度, 但是,当系统重新启动后, 序列又会加载一部分值到缓存中,原来没有用的值就会消失,这样会产生跳号的情况. 而select max(id),要从表中查询,这样会减慢处理速度. 单表的ID一定要求不要有跳号的情况发生时,使用select max(id),否则使用sequence. 简单使用select max(ID)还必须确保记录只是增加,没有删除,或者是不可能删除ID最大的记录,如果不是这样,那么会可能出现同一个ID代表两个不同记录(只有一个是当前表中存在的,其他是已删除的记录),这样就有歧异。 我认为,讨论max()的性能问题在这里不是最重要的。select max()最大的问题,就是多用户并发,会产生重复的问题。尤其在一个需要一定时间的transaction。如果大家有兴趣可以模拟以下。因此,序列号是最好的选择。在SQL Server中有一个identity也就是为了解决这个问题。 bobfang(匆匆过客) 说地很好,看来max()在实际商业系统中,作为序列号产生使用是很不恰当的。 个人觉得用序列好,特别在多用户下,保证了唯一性。在数据比较多的情况呀,性能也是比select max()好的。 支持enhydraboy(乱舞的浮尘) 的意见 这个主要是看业务需求! 如果要保持单号的连序,必须要MAX+1 to Tongls(编程杀手) 奇怪,什么叫单号的连序,难道MAX+1就不会跳号么?? ! 当然是序列好了,序列每次都是从缓存里取出来用的,比如建立序列的时候就直接将固定数目的序列建立在CACHE 中,比如是 ...MINVALUE 1 NOCYCLE CACHE 20 NOORDER ,这样,在调用的时候oracle每次都会将20个记录写入cache,用完20个后在调20个载入cache,性能当让要比直接写入内存的max函数要多多了 在Oracle上当然用序列最好,不存在效率问题,而随着表记录的增加,max(id)+1会带来性能方面的问题。如果还要考虑移植的话,不防使用中间序号表的方式。 请教一个tnsnames的问题 存储过程报错,请高手解决 查询数据特别慢,普通的一个查询也需要几十分钟 自增长列 请教一个数据库安装的问题,十万火急! 存储过程怎么返回数据集 急问高手:安装问题 oracle session问题,急!!! 关于数据库设计的问题,一个库中有两个相同结构的表,这样的设计合理吗? 关于ORA-01013的问题,紧急求助!!!!三千兄,救救我啊... 能否根据某一字段的值select出记录的条数 怎么样在ORACLE中复制一张表
但是有个公司的高手说序列不好,会产生乱码,select max()速度不比序列慢,他们一般用select max()或者自己建一个表来维护其它表中主键的最大值,
人家也是权威,没办法,所以希望各位有经验的大虾多说说具体的理由和优缺点!!!
而且自己建一个表来维护其它表中主键的最大值(而不是直接select max())也能很好地解决并发问题(可以写触发器,执行select max()时update id=id+1),至于哪个更快,偶就说不清,期待高手解答
个人认为序列要好些,简单。
当然,具体情况也要具体分析,也许在特定的情况下会有不同的结果
序列:效率高,使用简单。可移植性差。
max:效率慢,但是有一定的可移植性。
一般对可移植有要求的都用max(但是不是简单的用),比如用一张表保留每个表要用的序列最大值。
这样解决了效率也解决了可移植性
各位大虾多多指教!!!
维护问题能很好地解决的问题:
1、(Begin_Id and End_Id 中间有非排序,要解决排序);
2、序列有混和型:A1、A2...An;
3、序列和非序列型:出现于工序流程;
(2、3非纯序列问题)
单表单用(非关系表);简单的序列有他的优点;
触发器(关系表中排序):12种触发,也有他的优点(移植时compile);序列不好,会产生乱码?
移植时rowid?...?请惠子指之!
select max()最大的问题,就是多用户并发,会产生重复的问题。尤其在一个需要一定时间的transaction。如果大家有兴趣可以模拟以下。
因此,序列号是最好的选择。
在SQL Server中有一个identity也就是为了解决这个问题。
奇怪,什么叫单号的连序,难道MAX+1就不会跳号么??
而随着表记录的增加,max(id)+1会带来性能方面的问题。
如果还要考虑移植的话,不防使用中间序号表的方式。