Просмотр оптимизации с функцией подсчета в выводе - PullRequest
0 голосов
/ 18 января 2020

Я использую этот следующий вид непосредственно в SQL Server Management Studio. Он работает нормально, но я не могу понять, почему он слишком медленный.

Я проверил дисковый ввод-вывод, процессор и на сервере достаточно оперативной памяти. Внутренние таблицы имеют правильные индексы.

Можете ли вы помочь мне переписать / просмотреть его оптимизированным способом?

SELECT instances.id, 
       instances.unlisted, 
       instances.unread, 
       instances.folderid, 
       instances.partitionfactor, 
       instances.draftid, 
       instances.targetletterid, 
       instances.targetpendingletterid, 
       instances.flag, 
       instances.comments, 
       instances.viewdate, 
       drafts.attachmentcount                AS [DraftAttachmentCount], 
       drafts.bodyfilecount                  AS [DraftBodyFileCount], 
       drafts.[date], 
       drafts.sendertitle, 
       drafts.[browsetoreceiverlist], 
       drafts.[priority], 
       drafts.[priorityid], 
       drafts.subject, 
       drafts.[toreceiverlist], 
       drafts.[ccreceiverlist], 
       drafts.[security], 
       drafts.[securityid], 
       drafts.[body], 
       destinationSender.[fulltitle]         AS [DestinationSenderTitle], 
       incompleteDrafts.frozenid, 
       incompleteDrafts.frozenaction, 
       ( CASE WHEN Isnull(instances.[notecount], 0) = 0 THEN '' ELSE 'Note' END 
         + CASE 
         WHEN Isnull(instances.[alertcount], 0) = 0 THEN '' ELSE 'Alert' END + 
         CASE 
         WHEN Isnull([categorycount], 0) = 0 THEN '' ELSE 'Category' END ) 
                                             [AttachedObjects], 
       drafts.[guid]                         DraftGuid, 
       (SELECT Count(*) 
        FROM   dbo.myperfixdraftdestinationreceivers 
        WHERE  draftid = drafts.id)          [DraftDestinationReceivers], 
       (SELECT Count(*) 
        FROM   dbo.myperfixdraftdestinationreceivers 
        WHERE  draftid = drafts.id 
               AND ( receivertype = 4 
                      OR receivertype = 5 )) [ExternalReceivers] 
FROM   myperfixdraftinstances instances 
       LEFT JOIN myperfixdrafts drafts 
              ON ( drafts.[partitionfactor] = instances.[partitionfactor] 
                   AND drafts.[id] = instances.[draftid] ) 
       LEFT JOIN com_staff destinationSender 
              ON ( destinationSender.[id] = drafts.[destinationsenderid] ) 
       LEFT JOIN myperfixincompletesavedrafts incompleteDrafts 
              ON ( instances.id = incompleteDrafts.draftinstanceid ) 

go 

1 Ответ

0 голосов
/ 20 января 2020

Полагаю, виновным будет коррелированный подзапрос. Вы пытались удалить его?

И есть ли причина, по которой вам нужно выполнять внешние соединения? Вы возвращаете много значений из черновиков, но только внешние присоединяете его к экземплярам. Много ли у вас экземпляров без черновиков?

Если это так, вы можете улучшить их, выполнив внутренние объединения, а затем выполнить «объединение всех» между запросом, в котором вы просматриваете все экземпляры без черновиков, и запросом выше. с внутренним объединением в черновиках.

Моя первая попытка сохранить внешние объединения, но удалить соответствующие подзапросы:

with drafts AS
(
SELECT
       d.[id]
       d.attachmentcount, 
       d.bodyfilecount, 
       d.[date], 
       d.sendertitle, 
       d.[browsetoreceiverlist], 
       d.[priority], 
       d.[priorityid], 
       d.subject, 
       d.[toreceiverlist], 
       d.[ccreceiverlist], 
       d.[security], 
       d.[securityid], 
       d.[body],
       r.[DraftDestinationReceivers],
       r.[ExternalReceivers]
from myperfixdrafts d
left join 
    (SELECT draftid,Count(*) [DraftDestinationReceivers],sum(iif(receivertype in (4,5),1,0)) [ExternalReceivers] from dbo.myperfixdraftdestinationreceivers group by draftid) r
on d.[id]=r.draftid
)
SELECT instances.id, 
       instances.unlisted, 
       instances.unread, 
       instances.folderid, 
       instances.partitionfactor, 
       instances.draftid, 
       instances.targetletterid, 
       instances.targetpendingletterid, 
       instances.flag, 
       instances.comments, 
       instances.viewdate, 
       drafts.attachmentcount                AS [DraftAttachmentCount], 
       drafts.bodyfilecount                  AS [DraftBodyFileCount], 
       drafts.[date], 
       drafts.sendertitle, 
       drafts.[browsetoreceiverlist], 
       drafts.[priority], 
       drafts.[priorityid], 
       drafts.subject, 
       drafts.[toreceiverlist], 
       drafts.[ccreceiverlist], 
       drafts.[security], 
       drafts.[securityid], 
       drafts.[body], 
       destinationSender.[fulltitle]         AS [DestinationSenderTitle], 
       incompleteDrafts.frozenid, 
       incompleteDrafts.frozenaction, 
       ( CASE WHEN Isnull(instances.[notecount], 0) = 0 THEN '' ELSE 'Note' END 
         + CASE 
         WHEN Isnull(instances.[alertcount], 0) = 0 THEN '' ELSE 'Alert' END + 
         CASE 
         WHEN Isnull([categorycount], 0) = 0 THEN '' ELSE 'Category' END ) 
                                             [AttachedObjects], 
       drafts.[guid]                         DraftGuid, 
       drafts.[DraftDestinationReceivers], 
       drafts.[ExternalReceivers] 
FROM   myperfixdraftinstances instances 
       LEFT JOIN  drafts 
              ON ( drafts.[partitionfactor] = instances.[partitionfactor] 
                   AND drafts.[id] = instances.[draftid] ) 
       LEFT JOIN com_staff destinationSender 
              ON ( destinationSender.[id] = drafts.[destinationsenderid] ) 
       LEFT JOIN myperfixincompletesavedrafts incompleteDrafts 
              ON ( instances.id = incompleteDrafts.draftinstanceid )
...