Настройка запросов в SQL Server - PullRequest
       15

Настройка запросов в SQL Server

0 голосов
/ 30 августа 2018

Мой запрос занимает слишком много времени для выполнения. Я использую пять представлений в левом соединении, и я пытаюсь оптимизировать запрос. Я пытаюсь удалить подзапрос в левое соединение из предложения. Это правильный метод для оптимизации, потому что уже есть пять левых соединений? Пожалуйста, предложите.

Как я могу оптимизировать и переписать?

Оригинальный запрос

SELECT DISTINCT 
    TP.F_PRODUCT AS ID,
    TP.F_PRODUCT_NAME AS [NAME],
    (SELECT MS.F_MSDSTYPE_DESC FROM T_MSDSTYPES MS WHERE MS.F_MSDSTYPE = TP.F_SUBFORMAT AND MS.F_FORMAT = TP.F_FORMAT) AS SFMT,
    (SELECT TL.F_LANGUAGE_NAME FROM T_LANGUAGES TL WHERE TL.F_LANGUAGE = TP.F_LANGUAGE) AS LANG,
    TP.F_LANGUAGE AS LANGCODE,
    TP.F_SUBFORMAT AS SFMTCODE,
    TP.F_PLANT AS PLANTCODE,
    TP.F_FORMAT AS FMTCODE,
    CONVERT(VARCHAR,TP.F_DATE_REVISED,120) AS RDATE,
    CASE
       WHEN NOT(REPLACE(LTRIM(RTRIM(REPLACE(TP.F_CAS_NUMBERS,'¿',' '))),' ','; ') IS NULL OR REPLACE(LTRIM(RTRIM(REPLACE(TP.F_CAS_NUMBERS,'¿',' '))),' ','; ') = '') THEN REPLACE(LTRIM(RTRIM(REPLACE(TP.F_CAS_NUMBERS,'¿',' '))),' ','; ') 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 T_COUNTRIES TC WHERE TC.F_COUNTRY_CODE = TP.F_CUSTOM5) AS cus5,
    MAN.F_PHRASE AS MANU,
    CASE
       WHEN NOT(TP.F_CUSTOM3 IS NULL OR TP.F_CUSTOM3 = '') THEN TP.F_CUSTOM3 ELSE ''
    END + ' ' +
        CASE
            WHEN NOT(SYN.F_DATA IS NULL OR SYN.F_DATA = '') THEN SYN.F_DATA ELSE ''
        END AS SYN,
        IC.F_DATA AS ICO,
        'SDS - ' + (SELECT TL.F_LANGUAGE_NAME FROM T_LANGUAGES 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
    T_PDF_MSDS TP
LEFT JOIN 
    T_MSDSTYPES MS ON MS.F_MSDSTYPE = TP.F_SUBFORMAT 
                   AND MS.F_FORMAT = TP.F_FORMAT
LEFT JOIN 
    T_LANGUAGES TL ON TL.F_LANGUAGE = TP.F_LANGUAGE
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 
WHERE 
    (TP.F_CUSTOM5 IS NULL OR TP.F_CUSTOM5 = '')  
    AND (TP.F_SUBFORMAT IN (SELECT ITEM FROM SPLIT_NEW('EGHS,VCH,VJP,EGHS,VFR,VDE,VIR,AGHS,VUS,VCA,VCH,VJP',',')))  
    AND (TP.F_DATE_REVISED BETWEEN '2018-07-16 15:04:31' AND '2018-07-18 21:51:45')  
    AND TP.F_AUTHORIZED IN (1,3)

я удалил подзапрос (SFMT, LANG COLUMN NAMES), используя левое соединение следующим образом.

SELECT DISTINCT TP.F_PRODUCT AS ID,
        TP.F_PRODUCT_NAME AS [NAME],
        MS.F_MSDSTYPE_DESC AS SFMT,
        TL.F_LANGUAGE_NAME AS LANG,
        TP.F_LANGUAGE AS LANGCODE,
        TP.F_SUBFORMAT AS SFMTCODE,
        TP.F_PLANT AS PLANTCODE,
        TP.F_FORMAT AS FMTCODE,
        CONVERT(VARCHAR,TP.F_DATE_REVISED,120) AS RDATE,
        CASE
            WHEN NOT(REPLACE(LTRIM(RTRIM(REPLACE(TP.F_CAS_NUMBERS,'¿',' '))),' ','; ') IS NULL OR REPLACE(LTRIM(RTRIM(REPLACE(TP.F_CAS_NUMBERS,'¿',' '))),' ','; ') = '') THEN REPLACE(LTRIM(RTRIM(REPLACE(TP.F_CAS_NUMBERS,'¿',' '))),' ','; ') 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 T_COUNTRIES TC WHERE TC.F_COUNTRY_CODE = TP.F_CUSTOM5) AS cus5,
        MAN.F_PHRASE AS MANU,
        CASE
            WHEN NOT(TP.F_CUSTOM3 IS NULL OR TP.F_CUSTOM3 = '') THEN TP.F_CUSTOM3 ELSE ''
        END + ' ' +
        CASE
            WHEN NOT(SYN.F_DATA IS NULL OR SYN.F_DATA = '') THEN SYN.F_DATA ELSE ''
        END AS SYN,
        IC.F_DATA AS ICO,
        'SDS - ' + (SELECT TL.F_LANGUAGE_NAME FROM T_LANGUAGES 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 T_PDF_MSDS TP
    LEFT JOIN T_MSDSTYPES MS ON 
    MS.F_MSDSTYPE = TP.F_SUBFORMAT 
    AND MS.F_FORMAT = TP.F_FORMAT
    LEFT JOIN T_LANGUAGES TL ON 
    TL.F_LANGUAGE = TP.F_LANGUAGE
    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 WHERE (TP.F_CUSTOM5 IS NULL OR TP.F_CUSTOM5 = '')  AND  (TP.F_SUBFORMAT IN (SELECT ITEM FROM SPLIT_NEW('EGHS,VCH,VJP,EGHS,VFR,VDE,VIR,AGHS,VUS,VCA,VCH,VJP',',')))  AND (TP.F_DATE_REVISED BETWEEN '2018-07-16 15:04:31' AND '2018-07-18 21:51:45')  AND TP.F_AUTHORIZED IN (1,3)

улучшит ли это производительность?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...