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