web-dev-qa-db-ja.com

SQL ServerでのみUNCOMMITTED行を選択するにはどうすればよいですか?

私はライブCRMシステムに問い合わせる必要があるDWプロジェクトに取り組んでいます。標準の分離レベルは、パフォーマンスに悪影響を及ぼします。ロック/トランザクション分離レベルの読み取りをコミットせずに使用したくなります。ダーティリードによって識別された選択された行の数を知りたい。

9
BI Dude

多分あなたはこれを行うことができます:

SELECT * FROM T WITH (SNAPSHOT)
EXCEPT
SELECT * FROM T WITH (READCOMMITTED, READPAST)

しかし、これは本質的に際どいものです。

7
usr

なぜあなたはそれを知る必要があるのですか?

TRANSACTION ISOLATION LEVER READ UNCOMMITTEDを使用して、SELECTステートメントがテーブル/ページ/行で更新/挿入/削除トランザクションが完了するまで待機せず、dirtyレコード。そして、パフォーマンスを向上させるためにそれを行います。 どのレコードが汚れていたかについての情報を取得しようとすることは、あなたの顔にパンチブレンダーのようなものです。それは痛くてあなたに何も与えませんが、痛みを与えます。彼らはある時点で汚れていたので、今はそうではありません。それともまだ汚れていますか?知るか...

pd

次に、データ品質について説明します。次のようなクエリでダーティレコードを読み取ったと想像してください。

SELECT *
FROM dbo.MyTable
WITH (NOLOCK)

たとえば、id = 1name = 'someValue'でレコードを取得しました。名前を更新する場合は、「anotherValue」に設定します。次のクエリを実行します。

UPDATE dbo.MyTable
SET
    Name = 'anotherValue'
WHERE  id = 1

したがって、このレコードが存在する場合、実際の値がそこに表示されます。削除された場合(ダーティリードでも削除され、まだコミットされていません)、ひどいことは何も起こらず、クエリはどの行にも影響しません。それって問題ですか?もちろん違います。読んでから更新するまでの間に、物事は何億回も変わる可能性があります。 @@ROWCOUNTをチェックして、クエリが必要な処理を実行したことを確認し、結果についてユーザーに警告します。

とにかくそれは状況とデータの重要性に依存します。データ[〜#〜] must [〜#〜]が実際のものである場合-ダーティリードを使用しないでください

5
Sergio

標準の分離レベルはパフォーマンスに悪影響を及ぼします

では、なぜthatに対処しませんか?ご存知のとおり ダーティリードは一貫性のないリードです なので、使用しないでください。明白な答えは、スナップショットアイソレーションを使用することです。読み取り SQL Serverでのスナップショットまたは読み取りコミットスナップショットアイソレーションの実装:ガイド

しかし、実際には問題はさらに深くなります。 なぜブロッキングが発生するのですか?読み取りが書き込みによってブロックされるのはなぜですか? DWワークロードは、運用トランザクションデータで解放されるべきではありません。これが、ETLとOLAPの製品がある理由です。キューブ、列ストア、powerpivot、信じられないほど高速DWと分析。分析的なエンドツーエンドのスキャンでビジネス運用データベースに負担をかけないでください。問題が発生するだけです。

4
Remus Rusanu