動的SQLクエリを作成し、exec(@sql)を介して実行するストアドプロシージャがあります。
ストアド プロシージャは、約 12 個のテーブルを結合しています。そのとおり、比較的速く走っていました。しかし、その後、追加のフィールドに追加する必要がありました。これを行うために、次のようなスカラー関数を作成しました。
SELECT @weight = @weight +COUNT(*) FROM dbo.UserPDMedication WHERE UserID = @userid
SELECT @weight = @weight +COUNT(*) FROM dbo.[User] WHERE UserID = @userid AND HoehnYarhID IS NOT null
SELECT @weight = @weight +COUNT(*) FROM dbo.[User] WHERE UserID = @userid AND DateOfBirth IS NOT NULL
SELECT @weight = @weight +COUNT(*) FROM dbo.[User] WHERE UserID = @userid AND GenderID IS NOT NULL
SELECT @weight = @weight +COUNT(*) FROM dbo.[User] WHERE UserID = @userid AND DateDiagnosed IS NOT null
これは基本的に、ユーザーが入力した質問の数に基づいて int を返す単なる関数です。したがって、ストアド プロシージャ内の各ユーザーに対して、この関数が呼び出されます。ストアド プロシージャは次のようになります。
SELECT DISTINCT u.UserID, u.Healthy, u.DateOfBirth, u.City, st.StateCode AS State, u.GenderID, g.Gender, u.Latitude, u.Longitude, u.PDConditionID, u.Zip, u.Distance,
(SELECT TOP 1 EmailID FROM Messages m WHERE TrialID = ' + @trialID + ' AND ToUserID = u.userid AND LocationID = ' + @locationID + ') AS MessageID, dbo.UserWeightedValue(u.UserID) as wt
FROM [User] u
INNER JOIN aspnet_UsersInRoles uir ON u.AspnetUserID = uir.UserId
INNER JOIN aspnet_Roles r ON uir.RoleId = r.RoleId
FULL JOIN UserHealthCondition uhc ON u.UserID = uhc.UserID
FULL JOIN UserMotorSymptom ums ON u.UserID = ums.UserID
FULL JOIN UserNonMotorSymptom unms ON u.UserID = unms.UserID
FULL JOIN UserPDMedication updm ON u.UserID = updm.UserID
FULL JOIN UserPDTreatment updt ON u.UserID = updt.UserID
FULL JOIN UserSupplement us ON u.UserID = us.UserID
FULL JOIN UserPDGeneticMarker updgm ON u.UserID = updgm.UserID
FULL JOIN UserFamilyMember ufm ON u.UserID = ufm.UserID
FULL JOIN State st ON u.StateID = st.ID
FULL JOIN Gender g ON u.GenderID = g.ID
WHERE u.UserID IS NOT NULL
(これを短くするためにいくつかのチャンクを削除しました)。この get は、ストアド プロシージャで動的文字列として実行されます。これを最適化して速度を上げる方法に関するヒントはありますか?
ありがとう
編集:ここでの提案の組み合わせを使用して、これを機能させました。複数の select ステートメントを 2 つのステートメントに結合しましたが、関数はそのままにしました。その後、元のストアド プロシージャを取得し、select を ##temp への select に変更しました。そして、その一時テーブルに対して関数を実行しました。実行時間は 3 ~ 4 秒に短縮されました。私を正しい道に導いたのは彼の明確な指摘だったので、私はこの質問を認めるために信用を与える必要があると思います. でもみんなありがとう。