シーケンスオブジェクトとは?
SQLの中でアクセスすることで指定した増分で増えていく数列を作成することが可能です。
実装
DBMSによって異なりますが、以下のような項目を指定することが可能です。
- 開始値
- 増分
- 最大値
- 最小値
- 最大値に達した時の循環有無(循環の場合最小値に戻る。)
ユースケース
INSERT文の中に使う。
シーケンスオブジェクトによって払い出された連番を主キーに使ってINSERTする。
シーケンスオブジェクトの問題点
標準化されてないため、DBMSの実装依存になる。
DBを移植しないなら問題にはならないが・・。
システムで自動的に払い出すため、現実のエンティティ属性じゃない。
なお、現場においてはそこまで問題視はされない。
パフォーマンスに問題がある。
シーケンスオブジェクトが払い出す連番は以下の特徴があります。
「一意性がある」、「連続性がある(欠番が発生しない)」、「順序性がある」
なので、複数ユーザーの排他制御を行う必要があり性能が劣化することになります。
パフォーマンス対策
シーケンスオブジェクトを使う場合でもパフォーマンス対策を行うことができないことはないです。それは、CACHEや、NOORDERを使うことです。ただ、あまりいけてないです。
CACHEオプション
新しい値が必要になるたびにメモリに読み込む必要がある値の数を設定するオプション。実装によってデフォルト値は異なるが、この値を大きくすることによってアクセスコストを減らすことが可能になる。ただ、障害時は欠番が発生することになるので注意。
NOORDERオプション
順序性を担保しないことによってオーバーヘットを減らすことができるオプションです。ただ、後からアクセスしたユーザーのIDが小さくなることにつながるので、いけてないかもしれません。
IDENTITY列とは?
テーブルの列として定義して、データがINSERTされるたびにインクリメントされた値が追加されます。
評価
機能的にも性能的にもシーケンスオブジェクトの劣化になります。
性能
シーケンスオブジェクトで指定可能なCACHEや、NOORDERが指定できない。
MySQLの場合
MySQLの場合はシーケンスオブジェクトがありません。なので、IDENTITY列を使わざるおえないです。
他のDBを使う場合はより性能を担保しやすいシーケンスオブジェクトの利用を検討しましょう。
採番テーブル
昔は、IDENTITY列も、シーケンスオブジェクトもなかったのでよく使われていた手法になります。
これはテーブルで擬似的にシーケンスオブジェクトの技法を採用したものになります。
デメリット
- パフォーマンスは出ない。
- シーケンスオブジェクトのようにCACHEや、NOORDERなどの性能改善のオプションがない。
古いシステムでそれがボトルネックになっているケースはありますが、採番のSQLは非常に単純なものになるので改善の余地は基本的にありません。
この記事へのコメントはありません。