web-dev-qa-db-ja.com

リンクサーバーのタイムアウト-クエリなし

私は世界中の複数の地域で仕事をしています。実行されているリージョンとそのタイムゾーンによっては、ジョブが実行されない場合があります。 GOTOを使用して最後に到達し、時間と完了のためにスキップされたと報告します。

これは問題なく実行されます。

問題:procのさらに下のリンクサーバーに非常に大きな負荷がかかる場合があります。私たちはそれを知っており、それを避けることはできません-したがって、現時点ではリンクサーバーにクエリを送信しません。

しかし、クエリされたかのようにエラーが発生します。

リンクサーバーのOLE DBプロバイダー "SQLNCLI11"のスキーマ行セット "DBSCHEMA_TABLES_INFO"を取得できませんでした。メッセージ "未指定のエラー"が返されました。 [SQLSTATE 01000](エラー7412)OLEリンクサーバーのDBプロバイダー "SQLNCLI11"がメッセージ "クエリタイムアウトの期限切れ"を返しました。 [SQLSTATE 01000](エラー7412)。ステップは失敗しました。

リンクサーバーは、このスキーマチェックがタイムアウトになる原因となるプロシージャの開始時に検証されますか?

2
Tony Basallo

これは推測ですが、負荷の高い状態でリンクサーバーの遅延スキーマ検証を有効にしてみます。

EXEC master.dbo.sp_serveroption @server=N'Linked_Server_name', @optname=N'lazy schema validation', @optvalue=N'true'

このオプションがデフォルト値であるfalseに設定されている場合、SQL Serverは、リモートテーブルでのコンパイル以降に発生したスキーマの変更をチェックします。このチェックはクエリの実行前に行われます。スキーマに変更がある場合、SQL Serverは新しいスキーマを使用してクエリを再コンパイルします。

このオプションをtrueに設定すると、リモートテーブルのスキーマチェックは実行まで遅延されます。これにより、リモートテーブルのスキーマがクエリのコンパイルと実行の間で変更された場合、分散クエリがエラーで失敗する可能性があります。

ソース

リンクサーバー自体にクエリを実行するときに、リンクサーバーのメタデータのみをチェックします。

別の回避策は、動的SQLステートメントを使用してリンクサーバーにクエリを実行することです。

DECLARE @SQL nvarchar(max)
IF (Linked Server not under heavy load = true)
BEGIN
SET @SQL = 
N'SELECT * FROM OPENQUERY(LinkedServer,''SELECT * FROM master.sys.databases'')'
EXEC SP_EXECUTESQL @SQL
END
2
Randi Vertongen