概要
SQL Server のロックは、データベースを対象とした読み取りと書き込み時の一貫性を確保にするのに役立ちます。これは適切ですが、一方ではパフォーマンスに影響します。
詳細
以下の方法を使用することによって、ロック競合を減らして全体的なスループットを向上させることができます。
-
同じデータ ページ上で多数のプロセスが更新または挿入を実行しようとする状況を避けます。たとえば、このような状況はインデックスが付けられていないテーブルで発生する可能性があります。なぜならば、すべての追加はチェーン内の最後のページに対して行われるためです。様々なグループによりアクセスされる個別の履歴テーブルを作成することで、こうした状況での遅延を最小限に抑えることができます。さらに、データを分散するためのクラスタ化インデックスを作成することも効果があります。
-
ユーザーの対話などを含むトランザクションを避けます。ロックはトランザクションの実行中保持されるため、たった 1 人のユーザーがシステム全体の性能を低下させてしまう可能性があります。
-
データを変更するトランザクションの期間をできるだけ短くします。トランザクションが長く続くほど、それだけ排他ロックまたは更新ロックは長く保持されます。これによって、他のアクティビティがブロックされ、デッドロック状態の回数が増加することになります。
-
複数のトランザクションを 1 つのバッチにします。予期しないネットワークの問題によって、トランザクションの完了とロックの解放が遅れてしまうことがあります。
-
共有ロックの解除を待つことによって更新が遅れる可能性があるため、HOLDLOCK は必要なときのみ使用します。
-
インデックスの作成時には FILLFACTOR を減らして、同一ページを要求するランダム更新の発生頻度を抑えます。この方法は、頻繁にアクセスされる小さなテーブルでは特に効果があります。
-
SQL Server 4.2 DB-Library (DB-Lib) カーソル拡張機能を使用して、dbcursoropen() の CCUR_OPTCC 設定を使用しオプティミスティック同時実行制御を指定することができます。これは、高い頻度でユーザーとの対話を行い、高い同時実行性も必要とされるアプリケーションにとって理想的な方法です。このオプションによって、ユーザーがトランザクションをコミットしたい場合のみ更新ロックがかかるようになります。
詳細
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID
75722(最終更新日 1999-03-11) をもとに作成したものです。