[解決済み] あるプロセスがデッドロックの犠牲となる原因
質問
セレクトを使用した処理で、終了までに5~10分程度かかるものがあります。
現在、私は
を使用していません。
NOLOCK
を MS SQL データベースエンジンへのヒントとして使用します。
同時に、同じデータベースと同じテーブルに対して更新と挿入を行う別のプロセスもあります。
最初のプロセスが開始され、最近、メッセージで早々に終了するようになりました。
SQLEXCEPTION: トランザクションが他のプロセスとロック・リソースでデッドロックになり、デッドロックの犠牲者として選択されました。
この最初のプロセスは、同じ条件で他のサイトでも実行されていますが、データベースが小さいため、問題の select 文ははるかに短い時間 (30 秒程度のオーダー) で実行されます。 これらの他のサイトでは、デッドロックのメッセージは表示されません。 また、当初問題が発生しているサイトでは、このメッセージは出ませんでしたが、想定するに、データベースが大きくなったので、何らかの閾値を超えたのだろうと考えています。 以下は私の質問です。
- トランザクションの実行にかかる時間によって、関連するプロセスがデッドロックの犠牲者としてフラグを立てられる可能性が高くなる可能性はありますか。
- NOLOCK ヒントで select を実行した場合、問題は解消されますか?
- select 文の WHERE 句の一部としてチェックされる datetime フィールドが、遅いルックアップ時間を引き起こしているのではないかと思っています。 このフィールドに基づいたインデックスを作成することはできますか? それは望ましいことですか?
どのように解決するのですか?
<ブロッククオートQ1:トランザクションの実行にかかる時間によって、関連するプロセスがデッドロックの犠牲者としてフラグが立てられやすくなる可能性はありませんか?
いいえ。SELECT は読み取りデータしか持っていなかったので犠牲者であり、したがって、トランザクションは より低いコスト に関連付けられているため、犠牲者として選ばれます。
<ブロッククオート
デフォルトでは、データベースエンジンはデッドロックの被害者として、トランザクションを実行している
トランザクションを実行しているセッションを
ロールバックに最もコストがかからない
.
また、ユーザは、デッドロック状態におけるセッションの優先順位を
を使うことで、デッドロックの状況下でセッションの優先順位を指定することもできます。
SET DEADLOCK_PRIORITY
ステートメントを使用します。
DEADLOCK_PRIORITY は、LOW、NORMAL、または HIGH に設定することができ、代わりに
は、範囲 (-10 から 10) の任意の整数値に設定することができます。
Q2. NOLOCKヒントを指定してselectを実行すれば、問題は解消されるのでしょうか?
いいえ。いくつかの理由があります。
- まず、根本的な原因を調査することによって、デッドロックを適切に排除しようとする必要があります。
- ダーティリードは 一貫性のない読み取り .
- ダーティリードを指定する適切な方法は トランザクション分離レベル
- には、もっと良い解決策があります。 コミットされたスナップショットを読む .
Q3. select文のWHERE句の一部としてチェックされるdatetimeフィールドが、検索時間が遅くなる原因になっているのではないかと思っています。このフィールドに基づいたインデックスを作成することは可能でしょうか。それは望ましいことでしょうか?
おそらく。デッドロックの原因は、データベースのインデックスの不備である可能性が非常に高いです。10分クエリは、このような狭い条件では許容されますが、あなたのケースでは100%確実なのは、次のとおりです。 ではありません。 許容されません。
99% の信頼性で、デッドロックの原因は更新と競合する大規模なテーブルスキャンであると断言します。まず デッドロック グラフ をキャプチャして、原因を分析します。データベースのスキーマを最適化する必要がある可能性が非常に高いです。変更を行う前に、このトピックを読んでください。 インデックスの設計 とそのサブトピックを読んでください。
関連
-
[解決済み] SQL Serverで小数点の後に2桁の数字を表示させる方法
-
[解決済み] SQL Server Error "String Data, Right Truncation "の意味と修正方法について教えてください。
-
[解決済み] TEXTIMAGE_ON [PRIMARY]とは何ですか?
-
[解決済み] データベース 'tempdb' で CREATE TABLE 権限が拒否されました。
-
[解決済み] try catch ブロックで @@trancount > 0 を確認する必要があるのはどのような場合ですか?
-
[解決済み] 変数に値を代入するSELECT文は、データ検索操作と組み合わせてはいけません。
-
[解決済み] SQLでNaN値をNULLに、またはNaNを0に変換する
-
[解決済み] SQL Serverのタイムスタンプ列をdatetime形式に変換する方法
-
[解決済み] SQL Server リンクサーバーのクエリ例
-
[解決済み】SELECT文におけるNOLOCKヒントの効果について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] オブジェクト 'Users'、データベース 'XXX'、スキーマ 'dbo' で SELECT 権限が拒否されました。
-
[解決済み] データベース 'tempdb' で CREATE TABLE 権限が拒否されました。
-
[解決済み] COUNTフィールドが正しくないか、構文エラーです。
-
[解決済み] SSISで新しいレコードを挿入する前に、宛先テーブルを空にするにはどうすればよいですか?
-
[解決済み] EF: テキストデータ型は比較できないため、DISTINCT として選択できません。
-
[解決済み] 監査失敗、クレデンシャル検証 4776
-
[解決済み] 一括読み込みができません。オペレーティングシステムのエラーコード5(アクセスが拒否されました。)
-
[解決済み] 文字列から特定の文字を削除する
-
[解決済み] SQL ServerにおけるXOR
-
[解決済み] SQL Serverでマテリアライズド・ビューを作成する方法は?