The attached execution plan doesn't include the UNION. A UNION ALL there if you know there are no duplicates would help some. Also your execution plan doesn't show 1.2 million rows it is showing 35 rows total.
In your first query you do understand that the LEFT JOIN to EVALUATION is turned into an INNER JOIN because of the criteria WHERE "e.EVALUATION_ID = @EvaluationID" so you may not be getting the result you expect and because of this the only LEFT JOIN you are actually getting is to EVALUATION_CRITERIA_DETAIL.
The correlated sub-query to get the max(score) is most likely your biggest performance killer. I normally try to do something like that using either CROSS/OUTER APPLY or a CTE/Derived table to get the SUM. I might to it something like this:
SELECT
e.EVALUATION_ID,
efcd.EVALFORM_CRITERIA_ID,
efc.TITLE_NAME,
efc.BASE_CRITERIA_ID,
efcd.EVALFORM_CRITERIA_DETAIL_ID,
efc.CHILD_EXIST,
efc.PRIORITY_ORDER,
efc.WEIGHTAGE,
NULL, --efc.ANSWER_TYPE,
-- 'A', 1, GETDATE(), efc.LEVEL, efcd.SCORE
'A',
1,
GETDATE(),
efc.LEVEL,
detailScore.score
FROM
EVALFORM ef
INNER JOIN EVALFORM_CRITERIA efc
ON ef.EVALFORM_ID = efc.EVALFORM_ID
LEFT JOIN EVALFORM_CRITERIA_DETAIL efcd
ON efc.EVALFORM_CRITERIA_ID = efcd.EVALFORM_CRITERIA_ID
OUTER APPLY (
SELECT
MAX(score) AS score
FROM
EVALFORM_CRITERIA_DETAIL
WHERE
EVALFORM_CRITERIA_ID = efcd.EVALFORM_CRITERIA_ID AND
STATUS = 'A' AND
OMIT_FROM_SCORE = 'N'
) AS detailScore
INNER JOIN EVALUATION_DETAIL ed
ON efcd.EVALFORM_CRITERIA_DETAIL_ID = ed.EVALFORM_CRITERIA_DETAIL_ID
INNER JOIN EVALUATION e
ON ed.EVALUATION_ID = e.EVALUATION_ID
WHERE
e.EVALUATION_ID = @EvaluationId AND
efc.STATUS = 'A'
UNION
SELECT
@EvaluationId,
efc.EVALFORM_CRITERIA_ID,
efc.TITLE_NAME,
efc.BASE_CRITERIA_ID,
0,
efc.CHILD_EXIST,
efc.PRIORITY_ORDER,
efc.WEIGHTAGE,
NULL, --efc.ANSWER_TYPE,
'A',
1,
GETDATE(),
efc.LEVEL,
NULL --efcd.SCORE
FROM
EVALFORM ef
INNER JOIN EVALFORM_CRITERIA efc
ON ef.EVALFORM_ID = efc.EVALFORM_ID
LEFT JOIN EVALFORM_CRITERIA_DETAIL efcd
ON efc.EVALFORM_CRITERIA_ID = efcd.EVALFORM_CRITERIA_ID
WHERE
efc.CHILD_EXIST = 'Y' AND
efc.STATUS = 'A' AND
ef.EVALFORM_ID = @EvalformId
Jack Corbett
Consultant - Straight Path Solutions
Check out these links on how to get faster and more accurate answers:
Forum Etiquette: How to post data/code on a forum to get the best help
Need an Answer? Actually, No ... You Need a Question