У меня есть хранимая процедура, которая создает динамический 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 выполняется в виде динамической строки в хранимом процессе. Любые советы о том, как я могу оптимизировать это, чтобы ускорить процесс?
Спасибо
РЕДАКТИРОВАТЬ: я получил это работает, используя комбинацию предложений здесь. Я сохранил свою функцию как есть, хотя я объединил несколько операторов выбора в 2 оператора. Затем я взял исходный сохраненный процесс и изменил выбор на выбор в ## temp. А потом я запустил свою функцию на эту временную таблицу. Время выполнения сократилось до 3-4 секунд. Я думаю, что мне придется отдать должное гранту по этому вопросу, так как именно его указание отличило меня от правильного пути. Но спасибо всем.