ユーザー残高のゲームポイントを更新するストアドプロシージャがあります。 5つのサブクエリを持つ挿入物です。サブクエリの1つをクエリとして分離し、バッチ全体を遅くしました。それがなければ、ストアドプロシージャは2秒以内に実行されます。それで8秒かかるでしょう。 8秒は世界の終わりではありませんが、スケーラビリティのために、私はそれをより速く完了させる必要があります。ここで分離されたサブクエリは、次のとおりです。SQL結合を改善するヘルプ
私はさらに隔離するためにやっていること(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))
)
:私はちょうどインクルードは、(where句なし)参加する上での選択*を実行すると、非常に優れた性能 - の下で> 100000行秒。私がWhere句を追加するとき、大きな減速は 'or'節や評価される必要がある関数から来ていると私は信じています。
私が理解しているように、where句の中の関数は、各行を評価します。何らかの形で関数の定義をキャッシュし、その方法を評価するのとは対照的です。私はテーブルのインデックスを持っていますが、それらのいくつかが正しくないかどうか疑問に思っています。
完全なデータベース構造を理解していないと、問題がどこにあるのか把握することは非常に難しいと思いますが、さらに分離し始める方向に指摘したいと思います。
クエリの実行計画を見ましたか?それはしばしばあなたを正しい方向に向けるのに役立ちます。特に、インディーズが期待された場所で使用されない場合や、最もコストがかかるものがある場合は –
はい、それは機能です...何が消毒ですか? – IMAbev