2015-08-06 1 views
0

Нижеприведенный запрос занимает более минуты, чтобы завершить выполнение на столе с примерно 12 000 строк. Я понимаю, почему это происходит медленно из-за того, что на операцию приходится несколько операций, но я не знаю, как написать это, чтобы снизить стоимость. Заранее спасибо.Длинный запрос T-SQL - нужна помощь по оптимизации

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 
+1

попробовать используя EXISTS, а не IN – HLGEM

+0

Также этот код превращает левое соединение во внутреннее, так что вы, вероятно, не знаете правильных результатов. LEFT OUTER JOIN tblDocumentVersion onedv на onedv.ParagraphGUID = one.ParagraphGUID WHERE one.ParagraphNbr = para.ParagraphNbr И one.ChapterNbr = '1' AND onedv.VersionNumber = '14' – HLGEM

+0

Если вы не имеете индексы уже, tblParagraph .ParagraphGUID как кластерный индекс и tblDocumentVersion.ParagraphGUID как некластеризованный индекс. Кроме того, в зависимости от количества записей, идентификатор GUID может быть не лучшим вариантом для ID, обычно это лучший выбор. – Zukki

ответ

1

Ваш коррелированных запрос получает выполняется для каждой строки, возвращаемой внешним запросом, следовательно, снижает производительность, функция использования row_number, чтобы получить то, что вы после этого, что-то вроде этого .....

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 
+0

Это не отразило ожидаемый результат, как это сделал другой запрос. –

+0

Да, потому что этот запрос фактически выполняет 'LEFT JOIN', ваш запрос преобразует' LEFT JOIN' в 'INNER JOIN' из-за вашего предложения where. –

Смежные вопросы