TERADATA:查询优化

时间:2015-03-09 18:49:37

标签: sql teradata query-performance

此查询正在运行,但检索数据似乎需要比平时更长的时间。有没有更好的解决方案来优化此查询?我需要从T1和T2获得所有PRD_ID,即使与S1和S2不匹配。

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

1 个答案:

答案 0 :(得分:1)

我看不出为什么你需要所有这些(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 ;