Полагаю, виновным будет коррелированный подзапрос. Вы пытались удалить его?
И есть ли причина, по которой вам нужно выполнять внешние соединения? Вы возвращаете много значений из черновиков, но только внешние присоединяете его к экземплярам. Много ли у вас экземпляров без черновиков?
Если это так, вы можете улучшить их, выполнив внутренние объединения, а затем выполнить «объединение всех» между запросом, в котором вы просматриваете все экземпляры без черновиков, и запросом выше. с внутренним объединением в черновиках.
Моя первая попытка сохранить внешние объединения, но удалить соответствующие подзапросы:
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 )