Оставлено соединение с представлением, занимающим слишком много времени в SQL Server - PullRequest
0 голосов
/ 02 декабря 2018

Этот запрос занимает двадцать секунд, чтобы отобразить 53 000 записей.Этот запрос имеет пять левых соединений с представлениями.Но когда я закомментирую столбец MAN.F_PHR AS MANU в операторе выбора, для отображения 53 000 записей требуется три секунды.

Как я могу оптимизировать этот запрос?Представление V_PROD_ALIAS_MANU MAN содержит два левых объединения.Столбец MAN.F_PHRE AS MANU виден.Есть ли способ оптимизировать этот запрос?

SELECT DISTINCT 
    TP.PRODUCT AS ID,
    TP.NAME AS [NAME],
    TP.LANGUAGE AS LANGCODE,
    CONVERT(VARCHAR,TP.F_DATE_REVISED,120) AS RDATE,
    CASE
       WHEN NOT(REPLACE(LTRIM(RTRIM(REPLACE(TP.F_CAS_NUM,'¿',' '))),' ','; ') IS NULL OR REPLACE(LTRIM(RTRIM(REPLACE(TP.F_CAS_NUM,'¿',' '))),' ','; ') = '') 
          THEN REPLACE(LTRIM(RTRIM(REPLACE(TP.F_CAS_NUM,'¿',' '))),' ','; ') 
          ELSE REPLACE(LTRIM(RTRIM(REPLACE(CASN.F_DATA,'¿',' '))),' ','; ')
    END AS CASNUM ,
    TP.F_CUSTOM1 AS cus1,
    TP.F_CUSTOM2 AS cus2,
    (SELECT TC.F_COUNTRY_NAME FROM COUNTRIES TC 
     WHERE TC.F_COUNTRY_CODE = TP.F_CUSTOM5) AS cus5,
    MAN.F_PHR AS MANU,
    CASE
       WHEN NOT(TP.F_CUSTOM3 IS NULL OR TP.F_CUSTOM3 = '') 
          THEN TP.F_CUSTOM3 
          ELSE SYN.F_DATA
    END AS SYN, 
    IC.F_DATA AS ICO,
    'SDS - ' + (SELECT TL.F_LAN_NAME FROM T_LANGUAGE TL 
                WHERE TL.F_LANGUAGE = TP.F_LANGUAGE) + ' - PDF' AS DOC,
    '' AS COVER,
    CAST(TP.F_GUID AS VARCHAR(36)) + '_PDF' AS [GUID],
    'PDF' AS SDS
FROM 
    PDF TP
LEFT JOIN 
    V_PROD_ALIAS_SYN SYN ON TP.F_PRODUCT = SYN.F_PRODUCT
LEFT JOIN 
    V_PROD_ALIAS_SITE SIT ON TP.F_PRODUCT = SIT.F_PRODUCT
LEFT JOIN 
    V_PROD_ALIAS_ICO IC ON TP.F_PRODUCT = IC.F_PRODUCT
LEFT JOIN 
    V_PROD_ALIAS_MANU MAN ON TP.F_PRODUCT = MAN.F_PRODUCT
LEFT JOIN 
    V_PROD_ALIAS_CASN CASN ON TP.F_PRODUCT = CASN.F_PRODUCT

Запрос после комментирования столбца MAN.F_PHRE AS MANU для отображения 53 000 записей требуется три секунды.

SELECT DISTINCT 
    TP.PRODUCT AS ID,
    TP.NAME AS [NAME],
    TP.LANGUAGE AS LANGCODE,
    CONVERT(VARCHAR, TP.F_DATE_REVISED, 120) AS RDATE,
    CASE
       WHEN NOT(REPLACE(LTRIM(RTRIM(REPLACE(TP.F_CAS_NUM,'¿',' '))),' ','; ') IS NULL OR REPLACE(LTRIM(RTRIM(REPLACE(TP.F_CAS_NUM,'¿',' '))),' ','; ') = '') 
          THEN REPLACE(LTRIM(RTRIM(REPLACE(TP.F_CAS_NUM,'¿',' '))),' ','; ') 
          ELSE REPLACE(LTRIM(RTRIM(REPLACE(CASN.F_DATA,'¿',' '))),' ','; ')
    END AS CASNUM ,
    TP.F_CUSTOM1 AS cus1,
    TP.F_CUSTOM2 AS cus2,
    (SELECT TC.F_COUNTRY_NAME FROM COUNTRIES TC 
     WHERE TC.F_COUNTRY_CODE = TP.F_CUSTOM5) AS cus5,
    -- MAN.F_PHR AS MANU,
    CASE
       WHEN NOT(TP.F_CUSTOM3 IS NULL OR TP.F_CUSTOM3 = '') 
          THEN TP.F_CUSTOM3 
          ELSE SYN.F_DATA
    END AS SYN, 
    IC.F_DATA AS ICO,
    'SDS - ' + (SELECT TL.F_LAN_NAME FROM T_LANGUAGE TL 
                WHERE TL.F_LANGUAGE = TP.F_LANGUAGE) + ' - PDF' AS DOC,
    '' AS COVER,
    CAST(TP.F_GUID AS VARCHAR(36)) + '_PDF' AS [GUID],
    'PDF' AS SDS
FROM 
    PDF TP
LEFT JOIN 
    V_PROD_ALIAS_SYN SYN ON TP.F_PRODUCT = SYN.F_PRODUCT
LEFT JOIN 
    V_PROD_ALIAS_SITE SIT ON TP.F_PRODUCT = SIT.F_PRODUCT
LEFT JOIN 
    V_PROD_ALIAS_ICO IC ON TP.F_PRODUCT = IC.F_PRODUCT
LEFT JOIN 
    V_PROD_ALIAS_MANU MAN ON TP.F_PRODUCT = MAN.F_PRODUCT
LEFT JOIN 
    V_PROD_ALIAS_CASN CASN ON TP.F_PRODUCT = CASN.F_PRODUCT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...