2009-08-27 1 views
1

リンクされたサーバー上で外部結合を実行する特に高価な(そしてまれにしかない)クエリのトラブルシューティングを試みると、気になることがありました(2k5から2k5まで、異なる異なる物理マシン上のdbs)。この問題は一般的に実行時間のように見えるのではなく、外部結合がかなり大量に読み書きされているため、ロックされているようですが、NOLOCKヒントを結合ステートメントに追加するのは無駄なことでしょうか。SQL Server 2k5は、リンクされたサーバー上でロックのヒントを保持していますか?

私はすでにthis MSDN Social linkを発見した(とSOの質問を既存のチェック)しましたが、司会者は推測一つのこと(ヒントがワイヤ上を通過していないこと)、およびアスカーは後で、経験的に、彼は保存のヒントを見ていますと述べています。私はSOが私にもっと決定的な答えを見つけるのを助けるだろうと思った!

答えて

1

良い質問ですが、私は先に進んで、実際には答えず、と答えてREAD_COMMITTED_SNAPSHOTに設定してデータベースに設定してください。これにより、隔離レベルがデフォルトでブロックされないようにするREAD_COMMITTEDのトランザクションが防止されます。しかし、ロード・プロファイルがどのようなものなのかを理解する必要があるため、設定する前に設定を読んでおき、DBAはそれに応じてtempdbのサイズを確認する必要があります。

3

NOLOCKヒントを使用して、説明したシナリオ(2k5〜2k5、異なる物理マシン上の異なるdbs)でこのテストを行いました。SQLプロファイラは、リンクサーバーが指すコンピュータで実行されます。トレースは、ヒントがリンクサーバーで実行されたクエリに保存されているであることを示しています。

私は

select 1 from server.master.dbo.sysobjects with (nolock) 

を走り、トレースで次を見つけた:

declare @p1 int 
set @p1=4 
exec sp_prepexec @p1 output,NULL,N'SELECT (1) "Expr1003" FROM "master"."dbo"."sysobjects" "Tbl1002" WITH (NOLOCK)' 
select @p1 

ヒントは確かにありませんでしたので、私は、SQL 2005で新しい、これはSQLNCLIドライバの機能である疑いがありますSQL 2000のリンクサーバークエリで保持されます。 クエリでNOLOCKヒントを試す価値はありますが、クエリが実行されるときに更新されている行から汚いデータを取得している可能性があります。これは、データの使用方法によっては問題になる場合もありません。

+0

+1科学! – Eric

関連する問題