TERADATA:查询优化

TERADATA: query optimization

此查询有效,但检索数据似乎比平时花费了更长的时间。有没有更好的解决方案来优化这个查询?即使与 S1 和 S2 不匹配,我也需要从 T1 和 T2 获取所有 PRD_ID。

SELECT DISTINCT T.PRD_ID T.AMOUNT, T.DATE, T.REGION
FROM
(

       SELECT DISTINCT T1.PRD_ID, T1.PRD_CODE, S1.ORDER_DATE AS DATE, T1.REGION
       FROM
        (

               (SELECT  PRD_ID, PRD_CODE,AMOUNT,REGION
                FROM PRODUCT
                WHERE REGION='CA') T1

                LEFT JOIN SERVICE_1    S1  
                ON  S1.PRD_ID = T1.PRD_ID
                AND S1.PRD_CODE= T1.PRD_CODE
                AND S1.AMT = T1.AMOUNT
                AND S1.ORDER_DATE >= '01/01/2015' 
                AND S1.ORDER_DATE <= '02/28/2015'
        ) 

        UNION ALL

        SELECT DISTINCT T2.PRD_ID, T2.PRD_CODE, S2.ACCT_CALENDAR_DT AS DATE, T2.REGION
        FROM
         (

               (SELECT  PRD_ID, PRD_CODE,AMOUNT,REGION
                FROM PRODUCT
                WHERE REGION='IL') T2

                LEFT JOIN SERVICE_2   S2 
                ON  S2.PRD_ID = T2.PRD_ID
                AND S2.PRD_CODE= T2.PRD_CODE
                AND S2.AMT = T2.AMOUNT
                AND S2.ACCT_CALENDAR_DT >= '20150101'
                AND S2.ACCT_CALENDAR_DT <= '20150228'
        )
) T
ORDER BY REGION, ORDER_DATE DESC, PRD_ID

我不明白您为什么需要所有这些(3 层!)层级的嵌套表格。以下应该是等价的:

    SELECT DISTINCT
        T1.PRD_ID, T1.PRD_CODE, S1.ORDER_DATE AS DATE, T1.REGION
    FROM
        PRODUCT    T1
        LEFT JOIN SERVICE_1    S1  
            ON  S1.PRD_ID = T1.PRD_ID
            AND S1.PRD_CODE= T1.PRD_CODE
            AND S1.AMT = T1.AMOUNT
            AND S1.ORDER_DATE >= DATE '2015-01-01'   -- converted '01/01/2015' 
            AND S1.ORDER_DATE <= DATE '2015-02-28'   -- converted '02/28/2015'
    WHERE T1.REGION = 'CA'

UNION ALL                  -- No need for DISTINCT here. The Region
                           -- is different between the 2 parts.
    SELECT DISTINCT
        T2.PRD_ID, T2.PRD_CODE, S2.ACCT_CALENDAR_DT AS DATE, T2.REGION
    FROM 
        PRODUCT    T2
        LEFT JOIN SERVICE_2   S2 
            ON  S2.PRD_ID = T2.PRD_ID
            AND S2.PRD_CODE= T2.PRD_CODE
            AND S2.AMT = T2.AMOUNT
            AND S2.ACCT_CALENDAR_DT >= DATE '2015-01-01'
            AND S2.ACCT_CALENDAR_DT <= DATE '2015-02-28'
    WHERE T2.REGION = 'IL'

ORDER BY REGION, DATE DESC, PRD_ID ;   

或:

    SELECT DISTINCT
        T1.PRD_ID, T1.PRD_CODE, S1.ORDER_DATE AS DATE, 'CA' AS REGION
    FROM
        ( SELECT  PRD_ID, PRD_CODE, AMOUNT
          FROM PRODUCT
          WHERE REGION = 'CA'
        )    T1
        LEFT JOIN SERVICE_1    S1  
            ON  S1.PRD_ID = T1.PRD_ID
            AND S1.PRD_CODE= T1.PRD_CODE
            AND S1.AMT = T1.AMOUNT
            AND S1.ORDER_DATE >= DATE '2015-01-01'  
            AND S1.ORDER_DATE <= DATE '2015-02-28'  

UNION ALL 

    SELECT DISTINCT
        T2.PRD_ID, T2.PRD_CODE, S2.ACCT_CALENDAR_DT AS DATE, 'IL' AS REGION
    FROM 
        ( SELECT  PRD_ID, PRD_CODE, AMOUNT
          FROM PRODUCT
          WHERE REGION = 'IL'
        )    T2
        LEFT JOIN SERVICE_2   S2 
            ON  S2.PRD_ID = T2.PRD_ID
            AND S2.PRD_CODE= T2.PRD_CODE
            AND S2.AMT = T2.AMOUNT
            AND S2.ACCT_CALENDAR_DT >= DATE '2015-01-01'
            AND S2.ACCT_CALENDAR_DT <= DATE '2015-02-28'

ORDER BY REGION, DATE DESC, PRD_ID ;