SQLServerメモ

  • データベースロック
    • 行ロックの利点
      • 多数のスレッド内の異なったレコードにアクセスする際にロックの競合が少ない。
      • ロールバックの変更が少ない。
      • 単一レコードを長時間ロックすることができる。
    • 行ロックの欠点
      • ページレベルロックまたはテーブルロックよりも多くのメモリを消費する。
      • テーブルの広範囲で実行する場合、多数のロックが必要になるため、ページレベルロックまたはテーブルロックよりも処理速度が低下する。
      • テーブル全体を頻繁にスキャンする必要がある場合、他のロックよりも明らかに効率が悪化する。
    • テーブルロックの方が適している場面
      • 大部分が読み込み
    • OracleでいうForUpdateNowaitはどうやるの?
SELECT * FROM [テーブル名] WITH (UPDLOCK) [WHERE 〜]
      • ロック待ちしたくない場合はNOWAITをつける。
SELECT * FROM [テーブル名] WITH (UPDLOCK,NOWAIT) [WHERE 〜]
行バージョン管理を使用した分離レベルを利用しないことで、不必要な tempdb への書き込みを行わず、最高のパフォーマンスで提供することができます。
また、昼間のオンライン処理で同時実行性を考慮する必要がある時間帯では、tempdb の書き込みによるオーバーヘッドは伴いますが、優れた同時実行性を提供する行バージョン管理を使用した分離レベルを使用することでロック待機は減少し、全体的なスループットが向上します。
via)http://www.microsoft.com/japan/sqlserver/2005/facts/compare/03.mspx