2016-06-10 4 views
0

У меня есть следующий вид:Повышение производительности вид в 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 секунд (на данный момент это будет расти в будущем).

Как увеличить производительность представления?

Я читал об индексированных представлениях, но базовые таблицы не являются статичными, поэтому представляется опасным поставить индекс, который необходимо обновить, когда мы создадим нового пользователя/возможность/что угодно. Кроме того, я не могу изменить базовые таблицы, просто прочитайте их.

Я хотел бы получить любую помощь, которую вы можете предоставить.

Благодаря

+2

Вам не нужно ничего делать с индексным зрения, чтобы держать его в курсе, что это автоматически. Взгляните на ваш фактический план выполнения и посмотрите, что у вас есть время. Убедитесь, что ваши индексы обновлены. Кроме того, возьмите этот подзапрос из этого выражения CASE, добавьте его как кросс-соединение, если вам нужно –

+1

, запрос очень зависит от структуры индекса в ваших таблицах. покажите нам, какие индексы существуют. – xdd

+0

Просмотрите каждый 'DISTINCT'. Второе бессмысленно - оно должно быть TOP 1 или должно завершиться неудачей из-за нескольких строк в результате. И подстрока в соединении - плохая идея, конечно. –

ответ

0

Вы можете попробовать создать свой вид без подзапроса:

SELECT [OPER_ID] as IdOpportunity, 
     CASE WHEN LEN(partner_no) = 10 THEN u1.shortname ELSE partner_no END as ShortName, 
     o.CASETITLE as OpportunityDesc, 
     o.CLIENTSOLICID as IdClientSolic, 
     o.CLIENTSOLICNAME as ClientSolicDesc, 
     u.shortname as IdSocResp, 
     u.NAME + ' ' + u.Lastname_1 + ' ' + u.lastname_2 as SocRespName, 
     o.GROUPADMID as IdGroupAdm, 
     o.GROUPADMDESC as GroupAdmDesc, 
     o.OFFICEID as IdOffice, 
     o.OFFICEDESCRIPTION as OfficeDesc, 
     o.AREAID as IdArea, 
     o.AREADESC as AreaDesc, 
     o.TYPEOPERATION as OperationType 
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])) 
LEFT JOIN [SAP].dbo.tb_user_list_prod u1 
    ON u1.empid = right(partner_no, 8) AND year(u1.enddate) = 9999 
WHERE partner_fct IN ('ZCREA','Z6','Z2','ZLEAD','00000014','00000032') 
     AND PROCESS_TYPE IN ('ZOSE','ZOPB','ZOPP') 
     AND (CASE WHEN LEN(partner_no) = 10 THEN u1.shortname ELSE partner_no END) NOT IN ('','-') 
Смежные вопросы