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
에 결과를 제한하고있다. 나는 솔직히 그것이 전혀 작동한다는 것에 놀랐지 만 대부분의 시간을합니다.
더 효과적인 방법이 있습니까?
사실 내 쿼리보다 시간이 오래 걸렸습니다. 내부 쿼리를 사용하는 샘플 쿼리에서 내 버전은 84 초가 걸렸지 만 298 초가 걸렸습니다. 나는 그 이유를 완전히 이해하지 못하고 있지만 CTAS를 사용하는 버전을 통해 작업하고 있습니다. – Lenwood
'SELECT tab_code'를 내부 쿼리로 사용하여 동일한 성능을 얻었습니까? – Stavr00
나는 이것으로 상당히 어지럽 혔다. 내부 쿼리는 더 느리게 수행되지만, 한 번 타임 아웃되지 않았습니다. 이전에는 쿼리가 4 번에서 3 번 타임 아웃됩니다. SQL에 익숙하지 않아서 시간이 많이 걸리지 만 쿼리가 세션 당 10M 행을 반환합니다. 결과를 집계하기 위해 SQL에 요청하지 않았기 때문에이 행을 반환하는 데 더 많은 시간이 걸릴 수 있습니까? – Lenwood