SQL実践入門第8章を読んだ

この章では、集合志向であるSQLで、手続き型のコードをスマートに書く実装例などが豊富に紹介されていた。 が、他の章に比べて1回読んだだけでは意味もメリットもいまいち理解できなかったので、とりあえずよく理解できなかったところはまた読み直すとして、シーケンスオブジェクトとIDENTITY列についてまとめておくことにする。

シーケンスオブジェクト

  • テーブルやビューと同様に、スキーマ内に存在するオブジェクトの一つ。SQL文の中でシーケンスオブジェクトにアクセスすることによって、指定した増分で増えていく数列を生成できる
シーケンスオブジェクトの問題点
  • 標準化が遅かったので、構文が実装依存で移植性がない
  • システムで自動的に払い出す値の為、現実のエンティティの属性ではない
  • パフォーマンス問題を引き起こしやすい
    • デフォルトで「一意性」「連続性」「順序性」を担保した連番を払い出そうとするので、同時実行制御に起因するオーバーヘッドがある程度発生する
    • 連番のような近い値をINSERTすると、物理的に同じ領域にデータが格納されることになり、ストレージの特定のブロックだけI/O負荷が高くなって性能劣化が発生する(シーケンスオブジェクト特有の問題ではなく、そもそも連番を使用するケースで起きがち)

IDENTITY列

  • テーブルの列として定義して、データがINSERTされるたびにインクリメントされた数値が追加される
  • 機能的に性能的にもシーケンスオブジェクトの劣化版(らしい)
    • 機能的には、シーケンスオブジェクトがテーブルとは独立に任意のテーブルへ登録するデータに利用できるのに対し、IDENTITY列は特定のオブジェクトに結びついている
    • 性能的には、シーケンスオブジェクトで使用可能なCACHEやNOORDERが指定できない