さまざまな情報を返すために約 90,000 レコードを処理するために使用されるストアド プロシージャがあります。これは、実行するレコードをフィルター処理するために SQL テーブルに参加するだけです (これは、vb.net バッチが使用する前に別のプロセスから読み込まれます)。ここで、Windows アプリケーションを介して個々の人のために実行できる 90,000 人のストアド プロシージャとまったく同じロジックを用意する必要があります。私の最初の考えは、同じストアド プロシージャを使用し (ロジックを複製しないため)、次のいずれかをロード/使用する一時テーブル変数を持つことでした: -- 渡された memberID (Windows アプリ経由の場合) または -- 90,000 メンバーを含むテーブル (memberID が渡されず、バッチから呼び出された場合)。私の懸念は、個々の行に使用される場合もあれば、90,000 行に使用される場合もある場合に、クエリ プランにどのような影響があるかということです。パフォーマンスと効率はどのように影響を受けますか? これは良い考えですか?それとも、重複したロジックを持つ別のストアド プロシージャにする必要がありますか?
**以下は、私が話していることの詳細です。私はそれを単純化しようとしましたが、オンラインで表示するためにすべての名前を変更する必要がありました.
--===========================================================================================
--The first query is getting all the members information for the batch run.
--It is joining to a tmpMembers table which is loaded with the members for the batch run
--(filtering it down to approxiately 90,000 members for that batch run)
CREATE PROCEDURE s_GetMembersInfoSEL
AS
SELECT * --Includes a great deal of output (some of which is calculated before being returned)
FROM Members m
INNER JOIN tmpMembers tm
ON tm.MbrID = m.MbrID
--Also a bunch of other joins to member, claim, service, etc tables for the additional info.
--===========================================================================================
--Proposed changes...
CREATE PROCEDURE s_GetMembersInfoSEL
@MbrID INT = NULL
AS
DECLARE @MbrsTable TABLE (MbrID INT PRIMARY KEY)
IF @MbrID IS NULL
BEGIN
INSERT INTO @MbrsTable
SELECT MbrID
FROM tmpMembers
END
ELSE
BEGIN
INSERT INTO @MbrsTable
(MbrID)
VALUES (@MbrID)
END
SELECT * --Includes a great deal of output (some of which is calculated before being returned)
FROM Members m
INNER JOIN @MbrsTable tm
ON tm.MbrID = m.MbrID
--Also a bunch of other joins to member, claim, service, etc tables for the additional info.