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