У меня есть следующий вид:Повышение производительности вид в SQL Server
SELECT DISTINCT
IdOpportunity, IsNull(ShortName,'-') as ShortName,
OpportunityDesc,IdClientSolic, ClientSolicDesc, IdSocResp,
SocRespName, IdGroupAdm,
GroupAdmDesc, IdOffice, OfficeDesc,
IdArea, AreaDesc, OperationType
FROM
(SELECT
[OPER_ID] as IdOpportunity,
o.CASETITLE as OpportunityDesc,
o.CLIENTSOLICID as IdClientSolic,
o.CLIENTSOLICNAME as ClientSolicDesc,
o.GROUPADMID as IdGroupAdm,
o.GROUPADMDESC as GroupAdmDesc, o.OFFICEID as IdOffice,
o.OFFICEDESCRIPTION as OfficeDesc,
o.AREAID as IdArea, o.AREADESC as AreaDesc,
CASE
WHEN LEN(partner_no) = 10
THEN (SELECT DISTINCT shortname
FROM [SAP].dbo.tb_user_list_prod
WHERE empid = right(partner_no, 8)
AND year(enddate) = 9999)
ELSE partner_no
END as ShortName,
o.TYPEOPERATION as OperationType, u.shortname as IdSocResp,
u.NAME + ' ' + u.Lastname_1 + ' ' + u.lastname_2 as SocRespName
FROM
[SAP].[dbo].[ZTB_OPPMATT_BP]
INNER JOIN
[SAP].dbo.tb_opportunity_list_prod o ON o.OPPORTUNITYID = [oper_id]
INNER JOIN
[SAP].[dbo].[tb_user_list_prod] u ON u.empid = SUBSTRING(o.[LEADINGID], 3, LEN(o.[LEADINGID]))
WHERE
partner_fct IN ('ZCREA','Z6','Z2','ZLEAD','00000014','00000032')
AND PROCESS_TYPE IN ('ZOSE','ZOPB','ZOPP')) as WorkGroupView
WHERE
ShortName <> '' AND ShortName <> '-'
Базовые таблицы имеют следующую информацию:
- ZTB_OPPMATT_BP: 145000 строк
- tb_opportunity_list_prod: 46000 строк
- tb_user_list_prod : 120000 рядов
Если я попытаюсь выполнить это представление в sql-сервере, для завершения 150 000 строк потребуется около 16-20 секунд (на данный момент это будет расти в будущем).
Как увеличить производительность представления?
Я читал об индексированных представлениях, но базовые таблицы не являются статичными, поэтому представляется опасным поставить индекс, который необходимо обновить, когда мы создадим нового пользователя/возможность/что угодно. Кроме того, я не могу изменить базовые таблицы, просто прочитайте их.
Я хотел бы получить любую помощь, которую вы можете предоставить.
Благодаря
Вам не нужно ничего делать с индексным зрения, чтобы держать его в курсе, что это автоматически. Взгляните на ваш фактический план выполнения и посмотрите, что у вас есть время. Убедитесь, что ваши индексы обновлены. Кроме того, возьмите этот подзапрос из этого выражения CASE, добавьте его как кросс-соединение, если вам нужно –
, запрос очень зависит от структуры индекса в ваших таблицах. покажите нам, какие индексы существуют. – xdd
Просмотрите каждый 'DISTINCT'. Второе бессмысленно - оно должно быть TOP 1 или должно завершиться неудачей из-за нескольких строк в результате. И подстрока в соединении - плохая идея, конечно. –