私は以前にこのような質問を投稿しましたが、全体像を明確に説明しなかったようです。これを詳しく説明するために作成しました。これがストアドプロシージャです
USE [xxxx]
GO
/****** Object: StoredProcedure [dbo].[MARK_ACTIVE] Script Date: 4/20/2015 5:55:53 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[xxxx]
AS
SET ANSI_NULLS ON
INSERT INTO [123.456.7.890].[DBASE1].[dbo].[TABLE] (smsfr,smsmsg,smsdt,dbdt,devid,status,status2,IsHEX)
SELECT TOP 3 smsfr,smsmsg,smsdt,dbdt,devid,status,status2,IsHEX
FROM [098.765.4.321].[[DBASE2].[dbo].[TABLE2] cr
WHERE
NOT EXISTS (SELECT id,smsfr,smsmsg,smsdt,dbdt,devid,status,status2,IsHEX FROM [123.456.7.890].[DBASE1].[dbo].[TABLE] c
WHERE cr.smsdt = c.smsdt)
そして、これが私の仕事の設定です
マイジェネラル
マイステップ
前のステップ
マイスケジューラ
ストアドプロシージャを実行すると10秒未満で実行されますが、ジョブを使用してそのストアドプロシージャを呼び出そうとすると、これが起こります
進行中の状態が続くだけですが、何も起こりません。その状態でスタックしたように見えます。
リンクサーバーのセットアップでWindows認証を使用している場合、Kerberosが正しくセットアップされていても、SQL Serverエージェントを使用しても機能しません。これらの接続にSQL認証を使用するようにリンクサーバーを構成できますが、認証の構成が容易になるため、このためのSSISパッケージを作成することをお勧めします。
詳細については、リンクサーバーの構成を投稿してください。
クエリのコードは、以下に示すようにIPアドレスで識別される2つのサーバーを使用しています。サーバーはどこですか[123.456.7.890]?そして、サーバーはどこにありますか[098.765.4.321]?
私の推測では、[098.765.4.321]は[RemoteServer]であり、[123.456.7.890]は[LocalServer]です。
まず第一に、コードの遅さはSQLエージェントのせいではありません。 SQLエージェントから実行されるコードは、SSMSから直接実行されるコードとほぼ同じくらい効率的または非効率的です。問題は、あなたが思っているよりもはるかに多くのデータをリンクサーバー全体に移動していることです。コードの概要は次のとおりです。
INSERT ... INTO [LocalServer].[DBASE1].[dbo].[TABLE]
SELECT TOP 3 ... FROM [RemoteServer].[DBASE2].[dbo].[TABLE2]
WHERE NOT EXISTS
(SELECT ... FROM [LocalServer].[DBASE1].[dbo].[TABLE])
これを正しく解釈した場合、[RemoteServer].[DBASE1].[dbo].[TABLE]
のほとんどのデータを[LocalServer]
にドラッグして、tempdb
の作業テーブルに保存する必要があります。
WHERE NOT EXISTS
が、リンクサーバー全体で最初に一致する3つの一致する行を検索するために処理していることはほとんどありません。代わりに、ワークテーブルデータを処理してWHERE NOT EXISTS
でフィルタリングしてからTOP 3
行を選択する前に、データがローカルに存在するのを待つ可能性があります。
速度が遅いのは、サーバー間で移動されるデータの量と、[LocalServer]が[RemoteServer]の統計にアクセスできない可能性があるためです。
http://technet.Microsoft.com/en-us/library/で分散クエリを使用するためのガイドラインを読むこともできますms175129(v = sql.105).aspx 一部、ドキュメントには次のように記載されています。「最適なクエリプランを作成するには、クエリプロセッサにリンクサーバーからのデータ分散統計が必要です。」
OPENQUERYを使用してリモートサーバーから結果を取得すると、多くの場合、パフォーマンスが向上します。 OPENQUERYを使用すると、クエリはREMOTEサーバーに送信され、ローカルサーバーにデータを返すためにそこで実行されます。 (OPENQUERYでは、クエリはリモートサーバーで直接実行されるため、3つの部分からなる名前を使用していることに気づくでしょう。)
同様に、[RemoteServer]で実行するストアドプロシージャを作成すると、最初にそのサーバーで処理が行われ、その後、より限定的なデータセットが返されます。そのデータが返された後、[LocalServer]のコードでプロセスを完了できます。
データの移動は全体的なパフォーマンスにとってコストがかかり、サーバー間でのデータの移動はさらにコストがかかります。