1、identity
Oracle, DB2, pgSQL中都有sequence的概念,這個(gè)概念比Identity先進(jìn)很多,在Sybase中沒有Sequence對象,與之相對應(yīng)的是Identity
2、identity 的創(chuàng)建
identity跟sequence對象完成的功能類似,但是有一定的約束,每個(gè)table只能有一個(gè)identity的列,列的類型必須是numberic(n,0).
sql 代碼
create table table_name
(column_name numeric(precision ,0) identity)
3、identity gap的產(chǎn)生:
缺省情況下Sybase Adaptive Server會給identity字段分配一段數(shù)字到內(nèi)存中,在磁盤上記錄被分派到內(nèi)存中的最大的數(shù)值,
這樣就不用每次插入數(shù)據(jù)都需要寫磁盤來記錄當(dāng)前identity的最大值,而是直接在內(nèi)存中計(jì)算,以提高performance,默認(rèn)分配到內(nèi)存的
數(shù)值段是identity 字段最大值的 0.05%,這樣雖然提高了效率但是如果server fail或者no wait重起,那么內(nèi)存中的數(shù)字段就會丟失,DB Server
會從記錄在磁盤上的identity最大值開始計(jì)算identity值,就會產(chǎn)生gap,如果按照默認(rèn)值來計(jì)算,server fail 和no wait重起2000次,那么
identity字段就會溢出,必須增加identity字段的長度,其實(shí)這期間會有大量的gap
4、要點(diǎn)提示:
a:定義identity時(shí)要對數(shù)據(jù)量有個(gè)良好的估計(jì),例如上面的代碼中identity的最大值時(shí)10的precision次冪-1,對于所有的identity都定義
numberic(18,0)是不合適的,不可能所有的表都有幾十萬億的數(shù)據(jù)量
b:定義identity時(shí)要對數(shù)據(jù)量的增長情況有個(gè)良好的估計(jì),合理設(shè)置idnetity_gap的值,而不是默認(rèn)的值
sql 代碼
create table table_name
(column_name numeric(precision ,0) identity)
with identity_gap = value
這個(gè)value值會覆蓋db 默認(rèn)的是identity 字段最大值的 0.05%這個(gè)值。
在Sybase中使用
sp_chgattribute TableName, identity_gap, gap_value
來更改gap_value為一個(gè)合理的值
5、@@IDENTITY
可以使用 select @@IDENTITY 獲取 insert 之后的值