Tengo una consulta de Netezza con una cláusula WHERE que incluye varios cientos de cadenas potenciales. Me sorprende que se ejecute, pero lleva tiempo completarlo y ocasionalmente se producen errores ('transacción revertida por el cliente'). Aquí hay una versión de pseudocódigo de mi consulta.
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
;
En mi consulta, estoy limitando los resultados B.TAB_CODE
a aproximadamente 1200 valores (de más de 10 k). Honestamente, estoy sorprendido de que funcione, pero lo hace la mayor parte del tiempo.
¿Existe una forma más eficiente de manejar esto?
Si la IN
cláusula se vuelve demasiado engorrosa, puede realizar su consulta en varias partes. Cree una tabla temporal que contenga un conjunto TAB_CODE y luego utilícelo en un archivoJOIN
.
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
Si desea aumentar aún más el rendimiento, considere usar una tabla temporal real ( CTAS
)
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras