アプリケーションには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
?提案やパフォーマンスのヒントは大歓迎です。ありがとう。