web-dev-qa-db-ja.com

SQL Server 2014でのリンクサーバーの挿入が遅い

ローカルサーバーとリモートサーバーはすべてSQL Server 2008 R2を使用していましたが、ローカルサーバーは最近SQL Server 2014にアップグレードされ、リモートクエリのパフォーマンスが損なわれました(文字通り数分から数時間)。

問題はリモートサーバーへのデータの送信にあるようです。リモートサーバーからデータを読み取っている限り、クエリがローカルエンドのデータに基づいている場合は、効果的にデータをリモートサーバーに送信します。リモートサーバー側にリンクサーバーをセットアップできないため、リモートサーバーをローカルサーバーからプルできません。

ほとんどの場合、クエリを書き直して、リモートサーバーからローカルテーブルにデータをプルし、ローカルデータをフィルター処理して、比較的少ない更新をリモートサーバーに送信します。

ただし、多数のレコードが関係する処理を行う場合は、使用できません。典型的な例はこのクエリです(元々はローカルサーバーでより複雑なクエリを実行していたため、最初にファイナルテーブルのローカルコピーを作成するように変更して、INSERTに対して可能な限り単純なクエリを実行できるようにしました);

INSERT INTO [REMOTE-DB].Databasename.dbo.Test_Table
SELECT Person_Nbr, FullName, Birth
FROM Test_Table WITH (nolock)

私がOPENQUERYを試しても、速くはないようです。

INSERT OPENQUERY ([REMOTE-DB], 'SELECT Person_Nbr, FullName, Birth FROM Databasename.dbo.Test_Table')
SELECT Person_Nbr, FullName, Birth
FROM Test_Table WITH (nolock)

これがSQL Serverの古いバージョンでほぼ瞬時に機能したのでなければ、私はこれを現実の事実として受け入れますが、パフォーマンスに大きな違いがあるため、見逃している明らかな修正がいくつかあるように見えます。ローカルサーバーを制御することはできませんが、データベース管理者はデータベース構成が以前の設定と一致していると彼らからのDBAの主張を受けています。

これを修正するために私ができること、またはDBAに何を指摘できるかについてのアイデアはありますか?

5
Simon Holzman

「私のローカルサーバーとリモートサーバーはすべてSQL Server 2008 R2を使用していましたが、ローカルサーバーは最近SQL Server 2014にアップグレードされ、リモートクエリのパフォーマンスが損なわれました(文字通り数分から数時間)。」

SQL Serverのパフォーマンスが大幅に低下した場合、最初の応答は通常「何が変わったのですか?」

ローカルサーバーをSQL Server 2014にアップグレードしました。新しい Cardinality Estimator[〜#〜] ce [〜#〜])が導入されています。

ブログで引用されているように( トレースフラグを使用した2014 Cardinality Estimatorの慎重なテスト ):

SQL Server 2012に移行するときは、新しいカーディナリティエスティメータをすぐにオンにするのではなく、データベースをSQL Server 2012互換モードのままにして、最初に古いカーディナリティエスティメータを使い続けることをお勧めします。データベースが数週間落ち着くまで待ち、人々が彼らの不満を吹き飛ばし、システムが少なくとも古いシステムと同様に機能していることを確認するための時間を与えてください。

「DBA(ローカルサーバーの場合)は、データベース構成が古い設定と一致していると主張しています」と言います。では、新しいCEの影響を受けているかどうかはどのようにしてわかりますか?いくつかの方法があります。

まず、ローカルインスタンスに対してこのクエリを実行します。

select name, compatibility_level from sys.databases

互換性レベルが120以上の場合、確かに「might」が新しいCEを使用しています(セッションまたはグローバルトレースフラグ、またはQUERYTRACEONヒントを使用してオーバーライドされていない場合)古いCEの使用を強制するクエリ。)

新しいCEが使用されているかどうかを確認する別の方法は、「ローカル」クエリの実行プランXMLを調べて、文字列「CardinalityEstimationModelVersion」を見つけることです。

enter image description here

70の場合は、古いCEを使用しています。 120の場合は、新しいCEを使用しています。

私の提案は、新しいSql Server 2014 CEにかまれているかどうかを「最初に」把握することです。

このトピックに関するインターネット上の情報はかなりあります。

別の役立つリンクは SQL 2014 Cardinality Estimatorが朝食に悪いTSQLを食べる です。

1
Scott Hodgin