質問

私はウェブサイトとアプリケーションを作成するビジネスにいます いいえ ミッションクリティカル - >例。銀行ソフトウェア、宇宙飛行、集中治療監視アプリケーションなど。アイデアが得られます。

それで、その大規模な免責事項で、いくつかのSQLステートメントでNolockのヒントを使用するのは悪いことですか?数年前、仲間のSQL管理者から、「汚い読み」に満足している場合はNolockを使用する必要があることが提案されました。テーブル/行/何でも。

また、デッドロックを経験している場合、それは素晴らしい解決策だと言われました。そこで、SQLの第一人者がランダムコードを手伝って、SQLコードのすべてのノロックに気付くまで、数年間その考えをフォローし始めました。私は丁寧にoldられ、彼はそれを私に説明しようとしました(なぜそれは良いことではないのですか)、私はちょっと迷子になりました。彼の説明の本質は、「それはより深刻な問題に対するバンドエイドの解決策である」であると感じました。特に、あなたがデッドロックを経験している場合。そのため、問題のルートを修正します。

私は最近それについていくつかのグーグルをしました、そして出会いました この郵便受け.

それで、いくつかのSQL DB Guru Senseiは私を啓発してくれませんか?

役に立ちましたか?

解決

Nolockのヒントを使用すると、 SELECT 声明はです READ UNCOMMITTED. 。これは、クエリが汚いデータと一貫性のないデータが表示される可能性があることを意味します。

これは、原則として適用するのは良い考えではありません。ミッションクリティカルWebベースのアプリケーションでこの汚い読み取り動作が問題ない場合でも、Nolockスキャンは601エラーを引き起こす可能性があり、ロック保護の不足の結果、データの動きが原因でクエリが終了します。

読むことをお勧めします スナップショットの分離が役立つとき、そしてそれが痛いとき -MSDNは、ほとんどの状況ではスナップショットではなく、読み取り済みのスナップショットを使用することをお勧めします。

他のヒント

スタックオーバーフローに取り組む前に、私は反対していました NOLOCK 潜在的に実行できる校長について SELECTNOLOCK また、時代遅れまたは一貫性のないデータで結果を取り戻します。考える要因は、同じテーブルからデータを選択すると同時に、挿入/更新されるレコードの数です。これが多くのことが発生した場合、次のようなデータベースモードを使用しない限り、デッドロックの可能性が高くなります READ COMMITED SNAPSHOT.

それ以来、私はの使用に関する私の視点を変えました NOLOCK それがどのように改善できるかを目撃した後 SELECT パフォーマンスと、大量にロードされたSQLサーバーのデッドロックを排除します。データが正確に100%コミットされていないことを気にしない場合があります。

使用を考えているときに質問してください NOLOCK:

私のクエリには、多数のテーブルが含まれていますか INSERT/UPDATE コマンドと、クエリから返されたデータが特定の瞬間にこれらの変更が欠落している可能性があるかどうかは気にしますか?

答えがノーの場合は、使用してください NOLOCK パフォーマンスを改善するため。


簡単に検索しました NOLOCK Stack Overflowのコードベース内のキーワードと138のインスタンスが見つかったため、かなりの数の場所で使用します。

汚れた読み物を気にしない場合(つまり、主に読んだ状況で)、 NOLOCK 結構です。

しかし, 、ロックの問題の大部分は、クエリワークロードの「正しい」インデックスがないことによるものであることに注意してください(ハードウェアがタスクに達していると仮定します)。

そして、教祖の説明は正しかった。これは通常、より深刻な問題に対するバンドエイドソリューションです。

編集: :私は間違いなく、ノロックを使用する必要があることを提案していません。私はそれを明らかに明確にするべきだったと思います。 (私はそれを使用するだけで、極端な状況では、それが問題ないことを分析していました)。例として、しばらく前に、ロックの問題を軽減するためにノロックを振りかけられていたTSQLに取り組みました。それらをすべて削除し、正しいインデックスを実装し、すべてのデッドロックがなくなりました。

それは交通量の多い経験をした「第一人者」だったのではないかと疑っています...

通常、Webサイトは、完全にロードされたページを表示するまでに「汚い」ものです。データベースから読み込まれ、編集されたデータを保存するフォームを検討してください??それは、汚い読み物がそのようなノーであることについて人々が続ける方法はばかげています。

とはいえ、選択にいくつかのレイヤーが構築されている場合、危険な冗長性を構築することができます。お金またはステータスシナリオを扱っている場合、トランザクションデータの読み取り/書き込みだけでなく、適切な並行性ソリューション(ほとんどの「グル」は気にしない)が必要です。

一方、Webサイトの高度な製品検索(つまり、キャッシュされていないものが少し集中していないもの)を検索していて、少数の同時ユーザーを持つサイトを構築したことがあります(フェノミナルは何人「専門家」はそうではありません)、その背後にある他のすべてのプロセスを首に巻きつけることはredicです。

それが何を意味するのかを知って、必要に応じてそれを使用してください。あなたのデータベースはほとんど常にあなたのメインのボトルネックになり、ノロックを使用することについて賢くなると、インフラストラクチャで何千人ものものを節約できます。

編集: それはそれが役立つデッドロックだけではなく、あなたが他のすべての人にあなたが終わるまで待つか、またはその逆にあなたがどれだけあなたがどれだけあなたがどれだけあなたがどれだけあなたがどれだけあなたがどれだけあなたにどれだけあなたがどれだけあなたがどれだけあなたにどれだけあなたがどれだけあなたがどれだけあなたにどれだけあなたがどれだけあなたがどれだけどれだけですか。

EF4でNolockヒントを使用していますか?

答えは間違っていませんが、たぶん少し混乱しています。

  • 単一の値/行を照会するとき、それはそうです いつも Nolockを使用するための悪い練習 - おそらく、間違った情報を表示したり、誤ったデータにアクションを実行したりすることは決してないでしょう。
  • 大まかな統計情報を表示する場合、Nolockは非常に便利です。例として:ロックを取って読むのはナンセンスです ちょうど 質問のビューの数、またはタグの正確な質問の数。 「SQL-Server」でタグ付けされた3360の質問を誤って述べている場合、そしてトランザクションロールバックのために、3359の質問が1秒後に誤っていると述べている場合、誰も気にしません。

プロの開発者として、私はそれが依存すると言うでしょう。しかし、私は間違いなくギャットとOMGポニーのアドバイスに従います。あなたが何をしているのかを知って、それがいつ役立つか、いつ痛いときを知ってください

読んだ ヒントやその他の貧弱なアイデア

SQL Serverをより深く理解できるようにする理由。私は一般に、SQLのヒントは悪であるというルールに従いますが、残念ながら私は時々それらを使用します。

ルーク

App-SupportがSSMを使用してProduction-Serverからの広告クエリに答えたいと思ったとき(レポートを介してケータリングされていませんでした)、私は彼らがNolockを使用するよう要求しました。そうすれば、「メイン」ビジネスは影響を受けません。

私は、ノロックのヒントについてのいくつかのコメント、特に「適切なときにそれを使う」と言っている人に同意します。アプリケーションの書き込みが不十分で、同時性不適切な方法を使用している場合、ロックエスカレーションを引き起こす可能性があります。高度にトランザクションテーブルは、その性質のために常にロックされています。優れたインデックスカバレッジを持つことは、データの取得に役立ちませんが、隔離レベルを設定してcommittedを読み取ることはできません。また、変更の性質が予測可能な場合、Nolockヒントを使用することは安全であると思います。たとえば、旅行者との仕事が測定の挿入を伴うさまざまなプロセスを経ているときに製造業では、Nolockヒントで完成した仕事に対してクエリを安全に実行できます。 /ページ。この場合にアクセスするデータは静的ですが、数億のレコードと数千の更新/挿入物が1分あたりの非常にトランザクションテーブルに存在する場合があります。乾杯

Nolockを使用するのは事実上正しいことではないと思います。

単一の行を読んでいる場合、正しいインデックスは、個々の行アクションがすぐに完了するため、Nolockを必要としないことを意味します。

一時的なディスプレイ以外の多くの行を読んでいて、結果を繰り返すことができるか、生成された数で防御できることを気にしている場合、Nolockは適切ではありません。

Nolockは、「この回答には、削除された行、またはロールバックのために最初に挿入されなかった行が複製された行が含まれているかどうかは気にしません」の代理タグです。

Nolockの下で可能なエラー:

  • 一致する行はまったく返されません。
  • 単一行は複数回返されます(同じプライマリキーの複数のインスタンスを含む)
  • 一致しない行が返されます。

Nolock Selectが実行されている間にページの分割を引き起こす可能性のあるアクションは、これらのことを発生させる可能性があります。ほぼすべてのアクション(削除であっても)は、ページの分割を引き起こす可能性があります。

したがって、実行中に行が変更されないことを「知っている」場合は、インデックスが効率的な取得を可能にするため、Nolockを使用しないでください。

クエリの実行中に行が変更される可能性があると思われ、正確性を気にしている場合は、Nolockを使用しないでください。

デッドロックのためにNolockを検討している場合は、予期しないテーブルスキャンのクエリ計画構造を調べ、デッドロックを追跡し、それらが発生する理由を確認してください。 Nolock Around Writsは、以前にデッドロックされたクエリが潜在的に間違った答えを書く可能性があることを意味します。

可能であれば、より良い解決策は次のとおりです。

  • レポートデータベースにデータを複製します(ログ複製を使用して)。
  • San Snapshotsを使用して、DBの一貫したバージョンをマウントします
  • より優れた基本トランザクション分離レベルを持つデータベースを使用する

Snapshotトランザクションの分離レベルは、MSがOracleへの販売を失っていたために作成されました。 Oracleは、この問題を回避するために元に戻す/やり直しログを使用します。 PostgresはMVCCを使用します。将来、MSのHeckatonはMVCCを使用しますが、それは生産の準備ができてから何年も離れています。

Nolockは、データベースの読み取りをスピードアップする魔法の方法としてしばしば悪用されますが、可能であれば使用を避けようとしています。

結果セットには、まだコミットされていない行が含まれている場合がありますが、後でロールバックされることがよくあります。

エラーまたは結果セットが空になったり、行がありたりするか、同じ行を複数回表示することができます。

これは、他のトランザクションがそれを読んでいると同時にデータを移動しているためです。

Commitedは、複数のユーザーが同じセルを同時に変更する単一の列内でデータが破損する追加の問題を追加します。

すでに書かれたシステムに遭遇してテーブルにインデックスを追加するシステムに遭遇した実際の生活では、14GIGデータテーブルのデータロードが大幅に遅くなります。レポートでノロックとともに使用することを余儀なくされます。 、countなど)行、ページ、テーブルロック、全体的なパフォーマンスを決定しないでください。新しいシステムで簡単に言うのはnolockで使用されず、インデックスを使用することはありませんが、インデックスの追加データの読み込みを厳しく格下げします。その後、コードベースを変更してインデックスを削除し、バルクロードを再作成してからインデックスを再現します。新しいシステムを開発している場合は、すべてが順調で良いです。しかし、すでにシステムが整っているときではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top