3

以下は私が持っているシナリオです: 4 つのテーブルを結合してデータを返すストアド プロシージャがあります。1 日に 2 回、上記の 4つのテーブルのいずれかに一括アップロードが行われます。負荷は 10 ~ 15 分間続きます。このストアド プロシージャを呼び出す UI が、この 10 ~ 15 分間のウィンドウでフリーズ/ブロック/スローダウンすることは望ましくありません。上記のテーブルからダーティ/コミットされていないデータを表示することは気にしません。以下は私の質問です:

  1. 日中にロードされるテーブルだけで NOLOCK を使用する必要がありますか、それとも結合の 4 つのテーブルすべてに NOLOCK を追加する必要がありますか。例えば

    SELECT * 
    FROM Table1 T1 WITH (NOLOCK) --this is the table that will be bulk-loaded twice during the day
    INNER JOIN Table2 T2 WITH (NOLOCK)
    INNER JOIN Table3 T3 WITH (NOLOCK)
    INNER JOIN Table4 T4 WITH (NOLOCK)
    

    またはこれで十分ですか

    SELECT * 
    FROM Table1 T1 WITH (NOLOCK) --this is the table that will be bulk-loaded twice during the day
    INNER JOIN Table2 T2
    INNER JOIN Table3 T3
    INNER JOIN Table4 T4
    
  2. 取得手順の最初に SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED を追加し、最後に READ COMMITTED に戻すと、違いはありますか?

ありがとう

ヴィカス

4

1 に答える 1

6
  1. NOLOCK長期間ロックされるテーブルに対してのみ追加する必要があるため、のみに追加NOLOCKするだけTable1で十分です。
  2. 分離レベルを に設定すると、クエリを実行したすべてのテーブルに自動的に適用されるため、READ UNCOMMITTED追加する必要はまったくありません。NOLOCKつまり、質問項目 1 の最初の例と同様の状況を作成し、 にNOLOCK参加するすべてのテーブルに を適用しますSELECT

ところで、提示されているように、条件は有効な Transact-SQL ではないため、必ず句にON条件を追加してください。INNER JOIN

于 2013-08-05T18:50:24.700 に答える