Reputation: 1313
The query below is taking well over a minute to finish executing on a table with about 12,000 rows. I see why it is this slow due to there being multiple operations per operation but I am unaware of how to write this in a way to reduce the cost. Thanks in advance.
SELECT
para.ParagraphGUID,
para.Content,
ChapterNbr,
ParagraphNbr,
paragraphStatus,
para.CreateDate,
dv.VersionNumber
FROM
tblParagraph para
LEFT OUTER JOIN
tblDocumentVersion dv on dv.ParagraphGUID = para.ParagraphGUID
WHERE
ChapterNbr = '1' AND dv.VersionNumber = '14'
AND para.ParagraphGUID IN
(SELECT TOP 1 one.ParagraphGUID
FROM tblParagraph one
LEFT OUTER JOIN tblDocumentVersion onedv ON onedv.ParagraphGUID = one.ParagraphGUID
WHERE one.ParagraphNbr = para.ParagraphNbr
AND one.ChapterNbr = '1' AND onedv.VersionNumber = '14'
ORDER BY one.CreateDate DESC)
ORDER BY
order by ParagraphNbr ASC
Upvotes: 0
Views: 50
Reputation: 69494
Your correlated query gets executed for each row returned by the outer query hence the performance penalty, use row_number function to get what you are after, something like this.....
WITH CTE AS (
SELECT para.ParagraphGUID,
para.Content,
ChapterNbr,
ParagraphNbr,
paragraphStatus,
para.CreateDate,
dv.VersionNumber,
ROW_NUMBER() OVER (PARTITION BY para.ParagraphGUID ORDER BY para.CreateDate DESC) rn
FROM tblParagraph para
LEFT OUTER JOIN tblDocumentVersion dv on dv.ParagraphGUID = para.ParagraphGUID
AND ChapterNbr = '1'
AND dv.VersionNumber = '14'
)
SELECT * FROM CTE
WHERE rn = 1
ORDER BY ParagraphNbr ASC
Upvotes: 1