Rixhers Ajazi
Rixhers Ajazi

Reputation: 1313

Long T-SQL query - need help optimizing

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

Answers (1)

M.Ali
M.Ali

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

Related Questions