2012年12月9日日曜日

SQLSERVER デットロックを防ぐ②

デットロックが発生原因について、もうひとつ付け加えたい。

■現象

2つのセッションがあり、1つのテーブルがあるとする。

①あるセッションは、テーブルにINSERTを実行

②あるセッションは、条件指定でSELECTを実行

ここで、デットロックが発生したとする。

①と②は、まったく条件が異なるため、デットロックしないはずでは。。

■原因

テーブルには、INDEXが設定されており、INSERTが
COMMITされるまでは、その INDEX を利用したSELECTがロック待ちになる。
(INDEXの木構造を再構築中のためではないか)

■対策

INDEXを参照しないでSELECTする。
利用頻度が低い INDEX は、削除した方が、INSERTも早くなる。
INDEXは、パフォーマンスを大幅に改善することがあるが、
デットロックを引き起こす原因になることも忘れてはならない。








0 件のコメント:

コメントを投稿