2

アプリケーションには2000のアカウントがあります。最初のアカウントには、アカウントの最大制限である10000クライアントが含まれています。ユーザーは、最初のアカウントからクライアントを選択してから、いくつかのアカウントを選択して、選択したクライアントを選択したアカウントにコピーできます。したがって、可能な最大数は1999アカウントと10000クライアントです。

現在、アカウントリストをループして、クライアントアプリケーションからの各反復でストアドプロシージャを呼び出しています。反復ごとに、アカウントIDと、クライアントのIDのリストを含むテーブル値パラメーターがSPに渡されます。500アカウントと10000クライアントでテストしている間、25分、34秒、543ミリ秒かかります。SP内のある時点で、次のコードを使用しています–

INSERT INTO Client
SELECT AccountId, CId, Code, Name, Email FROM Client
WHERE Client.Id IN(SELECT Id FROM @clientIdList)

ここ@clientIdListで、は10000クライアントのIDを含むテーブルタイプ変数です。

重要なのは、反復ごとに10000個の新しいクライアントデータがクライアントテーブルに追加されているということです。したがって、反復ごとに、このINSERT操作は次の反復でより長くかかることになります。いくつかのSPパフォーマンスのヒントをグーグルで検索すると、このIN句はやや悪と見なされていることがわかりました。ほとんどの人は、INNER JOIN代わりに使用することを提案しています。そこで、上記のコードを–に変更しました

INSERT INTO Client
SELECT c.AccountId, c.CId, c.Code, c.Name, c.Email FROM Client AS c
INNER JOIN @clientIdList AS cil
ON c.Id = cil.Id

今では25分17秒407ミリ秒かかります。本当にエキサイティングなことは何もありません!

ストアドプロシージャの分野は初めてです。それで、この量のデータで、これほど長い時間がかかると思われますか?そして、私は与えられたシナリオのためにどれを考慮すべきですか、INそれともINNER JOIN?提案やパフォーマンスのヒントは大歓迎です。ありがとう。

4

1 に答える 1

1

ストアド プロシージャについて詳しく知らずに、何が起こっているのかを正確に伝えることは困難です。

私がお勧めするのは、実行計画を確認することです。これを行うには、SQL Server Management Studio を開きます。新しいクエリ ウィンドウで、関連するパラメーターを渡してストアド プロシージャを呼び出します。

これを実行する前に、[Query] メニューに移動し、[Client Side Statistics] と [Actual Execution Plan] メニュー項目を選択します。

クエリを実行します。

すべてが完了したら 25 分後に戻ってきて、下部に 3 つまたは 4 つのタブがあるはずです (データが返されるかどうかによって異なります)。結果用の 1 つのタブ、メッセージ用の 1 つのタブ、クライアントの統計用の 1 つのタブ、および 1 つのタブ実行計画のために。

クライアント統計タブは、行った変更がパフォーマンスに影響を与えるかどうかを確認するのに役立ちます (最後の実行のいくつかを保持して、それらに対するパフォーマンスを示します)。

さらに興味深いタブは実行計画タブです。これを見てください。次のようになります。 ここに画像の説明を入力

ここでは、クエリがすべてのテーブルで主キー インデックスを使用できたことがわかります。テーブル全体のスキャンに注意する必要があります (これは、インデックスを使用していないことを意味するためです)。また、クエリがそれほど単純ではなく、長い時間がかかり、インデックスを使用していない場合は、「クエリ 1」の下にあります。 「インデックスがありません」またはそれらの行に沿った何かを示す緑色のテキストになります。パフォーマンスを向上させるために作成する必要があるインデックスが表示されます。

また、各クエリの使用量がパーセンテージで示されていることにも注意してください。クエリが 1 つあったため、明らかに 100% の時間がかかりました。ただし、sproc に 5 つのクエリがあり、そのうちの 1 つに 80% の時間がかかっている場合は、最初にそれを確認することをお勧めします。

また、クエリの各部分に費やされた時間もパーセンテージで示されます。これは、クエリが何をしているのかを理解しようとするのに役立ちます。

これを実行すると、sproc に他の問題があると思います。そこからフォローアップの質問をすることができます。

于 2013-02-24T14:18:26.743 に答える