После переноса базы данных с сервера onprem в Azure у меня возникла проблема с производительностью запроса, которую вы можете найти ниже.
План фактического выполнения Azure:
https://ufile.io/o0z6ve6q
План фактического выполнения Onprem:
https://ufile.io/9kj3nc7d
В Azure он поставляется с Stream Aggregate, который требует сортировки данных, поэтому сортировка используется перед Stream Aggregate.
Можно ли как-то легко решить эту проблему, не перестраивая сам запрос?
Предыдущим экземпляром был SQL Server 2008, а azure - 2016.
ВЫБРАТЬ
[CommunicationId]
, CASE WHEN [SurveyPageName] like '%dystrybucja%' OR [SurveyPageName] LIKE '%pytania dodatkowe%' THEN [SurveyPageName] ELSE
ISNULL(LTRIM(RIGHT([SurveyPageName], LEN([SurveyPageName]) - CHARINDEX('-', [SurveyPageName]))),'')
END
+CASE WHEN [SurveyLineName] = 'Material range - Flexible Questions' THEN ''
WHEN [SurveyLineName] = 'Materials in catalogue - Products' THEN ''
WHEN [SurveyLineName] LIKE 'Zakres produktów%' THEN ''
ELSE '.'+ISNULL([SurveyLineName],'')
END
+CASE WHEN SurveyQuestion='ANS Y/N' THEN ''
ELSE '.'+ISNULL(SurveyQuestion,'.')
END
+CASE WHEN fac.SurveyProductId IS NULL THEN ''
WHEN SurveyProductName IS NULL THEN ''
WHEN SurveyProductName = SurveyLineName THEN ''
ELSE '.'+SurveyProductName
END AS [Question]
,MAX(CASE WHEN SurveyQuestion='Lost Since Last Visit' AND ISNULL([AnswerValue],[AnswerText]) < 0 THEN 0
ELSE ISNULL([AnswerValue],[AnswerText])
END) AS Answer
FROM FactSurvey fac with (nolock)
LEFT JOIN DimSurvey dim with (nolock) ON dim.[DimSurveyKey] = fac.[DimSurveyKey]
WHERE dim.IsText = 0
AND [SurveyPageName] NOT LIKE 'Wagi produktów%'
AND dim.SurveyQuestion NOT like '%RA'
AND [SurveyPageName] NOT LIKE 'Territory_KPI_Calculation'
AND [SurveyQuestion] NOT LIKE N'Szerokosc produktów%'
AND [SurveyQuestion] NOT LIKE N'Szer.%miej.%ekspo%'
AND [SurveyQuestion] NOT LIKE N'Weight'
AND [SurveyQuestion] NOT LIKE N'Only%for%'
AND [SurveyPageName] NOT LIKE N'KPI%'
AND ([SurveyPageName] NOT LIKE N'Report_Perfect Store%'
OR ([SurveyPageName]+[SurveyQuestion] LIKE N'Report_Perfect Store%' + N'%[%]%'
OR [SurveyPageName]+[SurveyQuestion] LIKE N'Report_Perfect Store%' + N'%decimal%'))
GROUP BY [CommunicationId]
,CASE WHEN [SurveyPageName] like '%dystrybucja%' OR [SurveyPageName] LIKE '%pytania dodatkowe%' THEN [SurveyPageName] ELSE
ISNULL(LTRIM(RIGHT([SurveyPageName], LEN([SurveyPageName]) - CHARINDEX('-', [SurveyPageName]))),'')
END
+CASE WHEN [SurveyLineName] = 'Material range - Flexible Questions' THEN ''
WHEN [SurveyLineName] = 'Materials in catalogue - Products' THEN ''
WHEN [SurveyLineName] LIKE 'Zakres produktów%' THEN ''
ELSE '.'+ISNULL([SurveyLineName],'')
END
+CASE WHEN SurveyQuestion='ANS Y/N' THEN ''
ELSE '.'+ISNULL(SurveyQuestion,'.')
END
+CASE WHEN fac.SurveyProductId IS NULL THEN ''
WHEN SurveyProductName IS NULL THEN ''
WHEN SurveyProductName = SurveyLineName THEN ''
ELSE '.'+SurveyProductName
END