2017-11-21 14 views
1

WHERE 절에 수백 개의 잠재적 문자열이 포함 된 Netezza 쿼리가 있습니다. 나는 그것이 실행되는 것에 놀랐지 만, 완료하는 데 시간이 걸리고 때때로 오류가 발생합니다 ('클라이언트가 롤백 한 트랜잭션'). 다음은 내 쿼리의 의사 코드 버전입니다. 내 쿼리에서WHERE 절에 수백 개의 문자열이 포함 된 Netezza SQL 쿼리가 향상되었습니다.

SELECT 
    TO_CHAR(X.I_TS, 'YYYY-MM-DD') AS DATE, 
    X.I_SRC_NM AS CHANNEL, 
    X.I_CD AS CODE, 
    COUNT(DISTINCT CASE WHEN X.I_FLG = 1 THEN X.UID ELSE NULL) AS WIDGETS 

FROM 
    (SELECT 
     A.I_TS, 
     A.I_SRC_NM, 
     A.I_CD, 
     B.UID, 
     B.I_FLG 

    FROM 
     SCHEMA.DATABASE.TABLE_A A 
     LEFT JOIN SCHEMA.DATABASE.TABLE_B B ON A.UID = B.UID 

    WHERE 
     A.I_TS BETWEEN '2017-01-01' AND '2017-01-15' 
     AND B.TAB_CODE IN ('00AV', '00BX', '00C2', '00DJ'... 
          ... 
          ... 
          ... 
          ... 
          ... 
          ... 
          ...) 
    ) X 

GROUP BY 
    X.I_TS, 
    X.I_SRC_NM, 
    X.I_CD 
; 

, 나는 (이상 10,000에서) 약 1,200 값 B.TAB_CODE에 결과를 제한하고있다. 나는 솔직히 그것이 전혀 작동한다는 것에 놀랐지 만 대부분의 시간을합니다.

더 효과적인 방법이 있습니까?

답변

3

IN 절이 너무 복잡하면 여러 부분으로 쿼리를 만들 수 있습니다. TAB_CODE 세트를 포함하는 임시 테이블을 만든 다음 JOIN에 사용하십시오. 당신이 더 많은 성능을 향상하려면

WITH tab_codes(tab_code) AS (
SELECT '00AV' 
UNION ALL 
SELECT '00BX' 
--- etc --- 
) 
SELECT 
    TO_CHAR(X.I_TS, 'YYYY-MM-DD') AS DATE, 
    X.I_SRC_NM AS CHANNEL, 
    --- etc --- 
    INNER JOIN tab_codes Q ON B.TAB_CODES = Q.tab_code 

은 (CTAS)

+0

사실 내 쿼리보다 시간이 오래 걸렸습니다. 내부 쿼리를 사용하는 샘플 쿼리에서 내 버전은 84 초가 걸렸지 만 298 초가 걸렸습니다. 나는 그 이유를 완전히 이해하지 못하고 있지만 CTAS를 사용하는 버전을 통해 작업하고 있습니다. – Lenwood

+0

'SELECT tab_code'를 내부 쿼리로 사용하여 동일한 성능을 얻었습니까? – Stavr00

+0

나는 이것으로 상당히 어지럽 혔다. 내부 쿼리는 더 느리게 수행되지만, 한 번 타임 아웃되지 않았습니다. 이전에는 쿼리가 4 번에서 3 번 타임 아웃됩니다. SQL에 익숙하지 않아서 시간이 많이 걸리지 만 쿼리가 세션 당 10M 행을 반환합니다. 결과를 집계하기 위해 SQL에 요청하지 않았기 때문에이 행을 반환하는 데 더 많은 시간이 걸릴 수 있습니까? – Lenwood

0
  1. 메신저가 제대로 추측 경우에서, X.I_TS는 '타임 스탬프'사실상 진짜 임시 테이블을 사용하는 것을 고려하고, 그래서 나는 그것이 하루에 많은 다른 가치를 포함 할 것으로 기대합니다. 그걸 확인할 수 있니? 맞다면 'XI_TS별로 그룹 ...'을 '1, ..., 그룹화'로 변경하면 도움이 될 수 있습니다.

  2. 또한 '개수 (고유 케이스 ...' 내가 맞다면 비싼 'DISTINCT'를 'MAX (사례 ...')로 변경하여 비울 수 있습니다.

나를 따라 줄 수 있니?

1

원본 테이블을 다른 테이블로 CTAS를 "저렴하게"볼 수있는 상황을 보았습니다 조건을 생성 한 다음 해당 테이블을 대신 쿼리합니다.