Oracle 10G consulta datos sucios y nunca regresa

Estoy tratando de hacer un informe de tres tablas donde los datos se cargan a diario. La trampa es que los datos están "sucios" (consulte la cláusula WHERE). Aunque tengo un índice en cada una de las tres tablas para la columna con la que hago mi combinación, la consulta nunca regresa.

SELECT 
A.SITE || ',' ||
A.SCRIPT || ',' ||
A.TESTRESULT || ',' ||
A.BISTERROR || ',' ||
A.HDDMANUFACTURER || ',' ||
A.TESTDATE || ',' ||
A.STB_MODEL || ',' ||
A.RECEIVERID || ',' ||
B.STB_MODEL || ',' ||
B.STB_MANUFACTURER || ',' ||
B.STB_MFRDATE || ',' ||
B.SW_VERSION || ',' ||
B.SW_NAME || ',' ||
B.HW_VERSION || ',' ||
B.RECEIVERID || ',' ||
C.HDDMODELNUMBER || ',' ||
C.HDDSERIALNUMBER || ',' ||
C.DISKPORT || ',' ||
C.DISKSIZE || ',' ||
C.SECTORSIZE || ',' ||
C.POWERONHOURS || ',' ||
C.CURRENTTEMP || ',' ||
MAX(TRUNC(A.LOAD_DATE)) 
FROM 
HDD_SMARTLOG_FILEINFO A, 
HDD_SMARTLOG_BOXINFO B, 
HDD_SMARTLOG_DISKINFO C 
WHERE 
A.FILENAME=B.FILENAME 
AND 
B.FILENAME=C.FILENAME 
AND 
INSTR(TRANSLATE(A.RECEIVERID,'0123456789','XXXXXXXXXX'),'X') != LENGTH(A.RECEIVERID) 
AND 
INSTR(TRANSLATE(B.RECEIVERID,'0123456789','XXXXXXXXXX'),'X') != LENGTH(B.RECEIVERID) 
AND 
LOWER(C.DISKPORT)='internal' 
AND 
A.SITE IS NOT NULL OR A.SITE <> '' 
AND 
A.BISTERROR IS NOT NULL OR A.BISTERROR <> '' 
AND 
B.STB_MODEL IS NOT NULL OR B.STB_MODEL <> '' 
AND 
B.SW_VERSION IS NOT NULL OR B.SW_VERSION <> '' 
AND 
C.POWERONHOURS IS NOT NULL OR C.POWERONHOURS <> '' 
AND 
C.CURRENTTEMP IS NOT NULL OR C.CURRENTTEMP <> '' 
AND 
INSTR(TRANSLATE(C.POWERONHOURS,'0123456789','XXXXXXXXXX'),'X') != LENGTH(C.POWERONHOURS) 
AND 
INSTR(TRANSLATE(C.CURRENTTEMP,'0123456789','XXXXXXXXXX'),'X') != LENGTH(C.CURRENTTEMP) 
GROUP BY 
A.SITE, 
A.SCRIPT, 
A.TESTRESULT, 
A.BISTERROR, 
A.HDDMANUFACTURER, 
A.TESTDATE, 
A.STB_MODEL, 
A.RECEIVERID, 
B.STB_MODEL, 
B.STB_MANUFACTURER, 
B.STB_MFRDATE, 
B.SW_VERSION, 
B.SW_NAME, 
B.HW_VERSION, 
B.RECEIVERID, 
C.HDDMODELNUMBER, 
C.HDDSERIALNUMBER, 
C.DISKPORT, 
C.DISKSIZE, 
C.SECTORSIZE, 
C.POWERONHOURS, 
C.CURRENTTEMP;

Solía ​​funcionar hace aproximadamente un mes cuando teníamos menos de 100 registros al día. Ahora, estamos procesando +/- 300K al día.

¿Cómo puedo optimizar esta consulta? Mi jefe quiere que se ejecute a diario. ¿Puede proporcionar algunos consejos?

Gracias de antemano!

preguntado el 08 de noviembre de 11 a las 19:11

1 Respuestas

Haz todos estos:

  1. Cree índices para los campos que forman parte de su dónde.

  2. En lugar de utilizar la multiplicación de Descartes (que está utilizando actualmente), utilice combinaciones.

  3. En su cláusula where, coloque primero los operandos lógicos más rápidos y menos probables. Por ejemplo, donde A y B son verdaderas si ambas son verdaderas, por lo que si A es falsa, B no se calculará en absoluto y ganará mucho tiempo. Esto podría ser una diferencia entre hacer cientos de miles de comprobaciones lógicas o no hacerlo, así que, por supuesto, se trata de una optimización.

No estoy reescribiendo su consulta, porque no puedo decir qué operandos son menos probables, qué operandos son más rápidos, tendrá que medir cada operando y ordenarlos de tal manera que los operandos menos probables o más rápidos se calculen primero y esperando que los demás no se calculen.

Espero que esto ayude.

respondido 08 nov., 11:23

Lo hace. Gracias. Aceptado. Votado. - Chris

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.