У меня есть хранимая процедура, которая выполняется для обновления игровых очков для баланса пользователя. Это вставка с 5 подзапросами. Я выделил один из подзапросов как запрос, который замедляет весь пакет. Без этого хранимая процедура будет выполняться менее чем за 2 секунды. С ним это займет целых 8 секунд. 8 секунд - не конец света, но ради масштабируемости мне нужно будет завершить его быстрее. Вот изолированный подзапрос:
(SELECT IsNull(Sum(A.TransAmount) + Sum(Case When A.BetResult = 1 Then (A.BetWinAmount + (A.TransAmount * -1)) End), 0)
FROM User_T A
LEFT OUTER JOIN User_TD B on A.TID = B.TID
LEFT OUTER JOIN Lines_BL C ON B.LID = C.LID
LEFT OUTER JOIN Lines_BM D ON C.BMID = D.BMID
LEFT OUTER JOIN Event_M E ON D.EID = E.EID
LEFT OUTER JOIN Event_KB F ON A.TransReason = F.BID
LEFT OUTER JOIN Event_M G ON F.BID = G.EID
where A.UserID = U.UserID AND (A.IsSettled = 1)
AND
(
(A.TransReason = 1 AND (datediff(dd, Convert(datetime, E.EDate, 101), Convert(datetime, @EndDate, 101)) = @DaysAgo)) OR
(A.TransReason >= 3000 AND (datediff(dd, Convert(datetime, G.EDate, 101), Convert(datetime, @EndDate, 101)) = @DaysAgo)
AND [dbo].[Event_CEAFKBID](A.TransReason) = 1) OR
(A.TransReason BETWEEN 3 and 150 AND (datediff(dd, Convert(datetime, A.TransDT, 101), Convert(datetime, @EndDate, 101)) = @DaysAgo))
)
Что я сделал для дальнейшей изоляции: когда я запускаю Select * только для объединений (без предложений where), производительность очень хорошая -> 100 000 строк в секунду. Как я добавляю в предложения where, я считаю, что значительное замедление связано с предложением 'или' и / или функцией, которую необходимо оценить.
Насколько я понимаю, функция внутри предложения where оценивает каждую строку - в отличие от какого-либо кэширования определения функции и оценки таким образом. У меня есть индексы в таблицах, но мне интересно, если некоторые из них не являются правильными.
Не зная всей структуры базы данных, я уверен, что будет очень трудно определить, где проблема, но я бы хотел указать направление, чтобы начать дальнейшую изоляцию.