タグ付けされた質問 「nolock」

4
NOLOCKは常に悪いですか?
私は、可能な限り効率的にクエリを作成したいレポート開発者です。以前は、運用サーバーでレポートを処理していたためNOLOCK、すべてのクエリで使用できると言っていたDBAと仕事をしていました。 今、私はNOLOCKどんな状況下でも禁止しているDBAと仕事をしています-私のレポート(いくつかのテーブルのインデックスがかなり不足しているため)がレプリケーションとシステムの更新を停止している場合でも。私の意見では、この場合、a NOLOCKは良いことです。 私のSQLトレーニングのほとんどは、非常に異なる意見を持つさまざまなDBAに来ているので、これを多種多様なDBAに依頼したいと思いました。

1
(NOLOCK)vs NOLOCK
次のようなクエリを見つけたとき、いくつかのブロッキングを調査していました。 SELECT SomeField FROM SomeTable NOLOCK 私はこれを見てNOLOCK、他のクエリ、この場合はDELETEステートメントをブロックする方法を知りました。私は使用しているロックを簡単に調べましたがsp_lock、ここに私が見たものがあります: DB S GRANT TAB IS GRANT PAG S GRANT さて、私の理解では、これNOLOCKはスキーマ安定性ロックのみを取得することになっていますが、なぜISロックを取得したのですか? 私の好奇心がそそられました。私はBOLを見て、それを使用する2つの方法がWITH (NOLOCK)あり、廃止予定(NOLOCK)であることがわかったので、それらを試してみることにしました。次のクエリを実行した後、実行しましたsp_lock: SELECT SomeField FROM SomeTable WITH (NOLOCK) DB S GRANT TAB Sch-Sグラント SELECT SomeField FROM SomeTable (NOLOCK) DB S GRANT TAB Sch-Sグラント 案の定、スキーマ安定性ロックがあります。だから私の質問はこれです:ここで何が起こっているのですか?NOLOCKを使用するために受け入れられ構文のいずれかである場合WITH (NOLOCK)や(NOLOCK)、なぜクエリのエラーは、それが単なるを実行したときに出ませんNOLOCK(括弧なし)?サポートされている場合、ISロックを取得するのはなぜですか?ここに何が欠けていますか?私はオンラインで答えを探していましたが、今のところ不足しています。 これを2008R2と2012の両方でテストしました。

3
すべてのクエリで(nolock)ヒントを使用しないで正当化する
クエリヒントを使用しないことを正当化する必要がありましたか? WITH (NOLOCK)非常に忙しいサーバーにヒットするすべてのクエリで見ています。開発者は、コードで何千回もそれを見るのが嫌いなので、デフォルトでオンにするだけだと思っているのです。 ダーティリードが許可され、最終的に不良データが発生することを説明しようとしましたが、パフォーマンスのトレードオフはそれだけの価値があると考えています。(それらのデータベースは混乱しています。パフォーマンスの問題があるのも不思議ではありません。) このNOLOCKヒントの悪用に対するケースを提示する方法の明確な例があれば、それはありがたいです。

1
「データの移動が原因でNOLOCKでスキャンを続行できませんでした」を再現する方法
NOLOCK一部の大規模なジョブで、「データの移動が原因でスキャンを続行できませんでした」というメッセージが時々表示さWITH (NOLOCK)れます。これは、選択クエリで実行されます。 これは、ページ分割があり、データが本来あるべき場所でなくなったときにデータを選択しようとすることと関係があることを理解しています。それが私の環境で起こっていることだと思います。 これをどのように再現しますか? 短期的な回避策を講じてエラーをキャッチし、これが発生したときに再試行しようとしていますが、再現できない場合はテストできません。これを引き起こす合理的に信頼できる方法はありますか? それが発生した場合、クエリを再度実行すると成功します。そのため、実際のデータやデータベースが永続的に破損する心配はありません。クエリ内の一部のテーブル(およびそのインデックス)は、頻繁に削除、再作成、および再設定されるため、これに関連していると想定しています。 削除NOLOCKは、私が対処する長期的な問題です。NOLOCKそもそもそこに置かれた理由は、クエリが非常に悪いため、日常のトランザクションでデッドロックが発生しNOLOCK、デッドロックを阻止するためのバンドエイドが機能したためです(機能しました)。ですから、永久的な解決策ができるまで、私はバンドエイドの上にバンドエイドを必要としています。 Hello Worldでそれを再現できれば、おそらく1時間もかからずにバンドエイドを仕事に投入する予定です。検索と置換の削除を実行できませんNOLOCK。これは、アプリのデッドロックが再び発生し始めるためです。 コミットされた読み取りスナップショット分離を使用することは良い可能性です。詳細については、データベースチームと協力する必要があります。私たちの問題の一部は、そのようなことを処理するSQL Serverの専門家がいないことです。また、現時点でその変更を行うのに十分な分離レベルを理解していません。

1
データ移動のため、NOLOCKでスキャンを続行できませんでした
SQL Server 2000を実行していると、これらのエラーのいくつかが毎晩発生します。 Could not continue scan with NOLOCK due to data movement このエラーをスローするクエリは、1ダースを超えるテーブルを結合する大きく複雑なクエリです。基礎となるデータは頻繁に更新できます。 文化的な「ベストプラクティス」は、過去にNOLOCKヒントを導入することでパフォーマンスが向上し、同時実行性が向上したことです。このクエリは100%正確である必要はありません。つまり、ダーティリードなどを許容します。しかし、これらすべてのロックヒントがあるにもかかわらず、データベースがこのエラーをスローする理由を理解するのに苦労しています。 誰もがこれにいくつかの光を当てることができます-穏やかに、私は実際にはプログラマーであり、DBAではありません:) PS:以下の修正を以前に適用しました:http : //support.microsoft.com/kb/815008

1
NOLOCKがデッドロックの問題の原因であることをどのように証明できますか?
私はウィンドウズ/マックタイプの議論を始めることを試みていません。 個人NOLOCK的には、再帰的な実践としては良い考えではない説得力は必要ありません。すべてを開発しているときは、反動的ではなく意図的である必要があります(/ amen) ですから...担当プログラマが主張するのNOLOCKが先です。すべてのアドホッククエリで、プロダクションをクエリするときは常にお勧めします。すべてのテーブルにnolockヒントがないストアドプロシージャを見たことはありません。 それをバックアップする何かがなければ、コアの信念はすべて間違っていると言ってやって来る人になりたくない。 さまざまなブログ投稿の下にあるコメントセッションを見るだけでは、リンクを送信するだけでは不十分な場合があります。長年の信念など...それが問題であると確信していない人もいます。参照:私が読んだすべてのnolockブログ投稿の下のコメントセクション。 現在、他の一部のDBAは、不可解なデッドロックに取り組んでいます。NOLOCKがソースであるかどうかをどのように判断しますか? トレースなどからXMLを見ることをお勧めしますが、これはデッドロックが問題を引き起こしていることを明示的に示すものではありませんか?単純なエラーメッセージは見たことがありません。本当? 他にどのようにしてこれらのデッドロックをこれに固定することができますか? のようなDDLステートメントCREATEは手がかりになります。指摘することができる出力や、アラームを上げる前に理論を裏付けるのに役立つと思われるデータの一部はありますか? または、トレースフラグまたは拡張イベントを実行して、デッドロックが発生したときに何が実行されているかを特定し、DDLステートメントから推定していますか? nolockヒントを使用してデータがめちゃくちゃになるさまざまな方法をすべて見てみると、明確に特定するのは難しい問題のようです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.