identityの値で大幅な誤差がでる範囲を理解する
0.改訂履歴
- 2002.08.14新規作成
1.はじめに
このドキュメントでは,Sybaseで,identityを含むテーブルで,連番の誤差が発生する範囲について説明する.
なお,使用しているSybaseは,RedHat Linux 7.2上で稼働しているSybase SQL Server 11.0.3.3である.
2.identityは大きく誤差が発生する可能性がある
- Sybase ASEが異常終了した場合,次にINSERTしたデータのidentityの値が大きく狂う事がある.
- たとえば,次のような感じ.
- 1
- 2
- 3
- 異常終了
- 5001
- 5002
- 5003
- これは,Sybase ASEの中で次に発行するidentityの値をメモリ内に持っているため,Sybaseの異常終了によってその値が失われる.
- 失われるが,データベースの中では発行済みの値なので,次の値が飛んでしまう.
3.誤差の範囲について
- identityの値で誤差がでる範囲は,次のサーバパラメータによって制御されている.
|
- このパラメータのデフォルトの設定値を確認してみる.
1> sp_configure "identity burning set factor" 2> go Parameter Name Default Memory Used Config Value Run Value ------------------------------ ----------- ----------- ------------ ----------- identity burning set factor 5000 0 5000 5000 (return status = 0) 1> |
- この場合,絡むの桁数の0.05%(0.0005)の誤差がでる.
- つまり,numeric(10,0) identityで定義しているフィールドだと,誤差は500,000となる.
- このサーバパラメータを100と設定すると,誤差は10,000になる.
- ただし,値をメモリに持たない分,処理が遅くなる.(微々たるものではないかなぁ?)