Cómo networkingucir el time de ejecución de consultas para la tabla con enormes datos

Estoy ejecutando esta consulta en producción (Oracle) y me está tomando más de 3 minutos. ¿Hay alguna salida para networkingucir el time de ejecución? Tanto svc_order como la tabla de events contienen casi 1 millón de loggings.

select 0 test_section, count(1) count, 'DD' test_section_value from svc_order so, event e where so.svc_order_id = e.svc_order_id and so.entenetworking_date >= to_date('01/01/2012', 'MM/DD/YYYY') and e.event_type = 230 and e.event_level = 'O' and e.current_sched_date between to_date( '09/01/2010 00:00:00', 'MM/DD/YYYY HH24:MI:SS') and to_date('09/29/2013 23:59:59', 'MM/DD/YYYY HH24:MI:SS') and (((so.sots_ta = 'N') and (so.action_type = 0)) or ((so.sots_ta is null) and (so.action_type = 0)) or ((so.sots_ta = 'N') and (so.action_type is null))) and so.company_code = 'LL' 

Mirando lo que dijiste, no puedes crear índices. Espero que la consulta esté haciendo un escaneo completo de la tabla en la table. Por favor, intente una pista paralela.

 select /*+ full(so) parallel(so, 4) */ 0 test_section, count(1) count, 'DD' test_section_value from svc_order so, event e where so.svc_order_id = e.svc_order_id and so.entenetworking_date >= to_date('01/01/2012', 'MM/DD/YYYY') and e.event_type = 230 and e.event_level = 'O' and e.current_sched_date between to_date( '09/01/2010 00:00:00', 'MM/DD/YYYY HH24:MI:SS') and to_date('09/29/2013 23:59:59', 'MM/DD/YYYY HH24:MI:SS') and (((so.sots_ta = 'N') and (so.action_type = 0)) or ((so.sots_ta is null) and (so.action_type = 0)) or ((so.sots_ta = 'N') and (so.action_type is null))) and so.company_code = 'LL' 

Al less podrías evitar la triple list AND / OR usando COALESCE() (o su equivalente en el oracle IFNULL() ) Nota: esto no capta el caso donde tanto sots_ta como action_type son NULL.

 SELECT 0 test_section, count(1) count, 'DD' test_section_value FROM svc_order so JOIN event e ON so.svc_order_id = e.svc_order_id WHERE e.event_type = 230 and e.event_level = 'O' AND so.entenetworking_date >= to_date('01/01/2012', 'MM/DD/YYYY') AND e.current_sched_date >= to_date('09/01/2010 00:00:00', 'MM/DD/YYYY HH24:MI:SS') AND e.current_sched_date < to_date('10/01/2013 00:00:00', 'MM/DD/YYYY HH24:MI:SS') AND COALESCE(so.sots_ta, 'N') = 'N' AND COALESCE(so.action_type, 0) = 0 AND so.company_code = 'LL' 

Reemplacé el medio por un plano t >= low AND t. < high) t >= low AND t. < high) test porque no me gusta between semántica. FROM kommalist el FROM kommalist por un JOIN porque me gusta más.

No podemos tener índices adicionales, pero las tablas deben tener al less el significado de key primaria completa, ¿correcto? ¿Existe alguna? Eso debería dar como resultado al less índice, no / agrupado, cualquier cosa. Míralo y trata de usarlo.

En caso de que la tabla sea un montón, y queremos ocuparnos de ella tal como está, entonces deberíamos networkingucir las filas numéricas en cada tabla individualmente aplicando los respectivos filters de location y luego combinar ese set de resultados. En su consulta, solo el significado de la columna de resultados completos depende de las tablas base que es el recuento (1). Otras dos columnas son constantes. Porque también JOIN / Cartesian Product etc … conducirá el motor de DB a search Índices, así que en su lugar use INTERSECT que creo que debería ser mejor en su caso. Algunos otros cambios que puede hacer: Evite usar TO_DATE o cualquier tipo de function en el lado derecho de la columna de la condición WHERE. Prepare los datos en la variable local y use la variable local en la consulta. También necesita verificar si hay alguna ganancia de performance con> = que ENTRE?

He modificado la consulta y también combiné una condición networkingundante donde. Recuerde que si esto cambia funciona para usted en este momento, eso no significa que funcionará siempre. A medida que su table comience a golpear más datos que califiquen esas DONDE las condiciones vuelven a aparecer como una consulta lenta. entonces, a corto ploop esto podría funcionar, pero a largo ploop debe pensar en opciones alternativas

  1) for example Indexed Views on top of this tables 2) Create same tables with different name and sync data between new and original table using “Insert/Update/Delete Trigger”. SELECT COUNT(1) AS [COUNT], 'DD' test_section_value ,0 test_section FROM ( SELECT so.svc_order_id FROM svc_order so WHERE so.entenetworking_date >= to_date('01/01/2012', 'MM/DD/YYYY') AND so.company_code = 'LL' INTERSECT SELECT e.svc_order_id FROM event e WHERE e.event_type = 230 AND e.event_level = 'O' AND e.current_sched_date BETWEEN to_date('09/01/2010 00:00:00','MM/DD/YYYY HH24:MI:SS') AND to_date('09/29/2013 23:59:59','MM/DD/YYYY HH24:MI:SS') AND ( (( so.sots_ta = 'N' ) AND ( so.action_type IS NULL OR so.action_type = 0)) OR (( so.sots_ta IS NULL ) AND ( so.action_type = 0 )) --or ((so.sots_ta = 'N') and (so.action_type is null)) ) )qry1 

Primero, asegúrese de que las statistics estén actualizadas.

 begin dbms_stats.gather_table_stats('[schema]', 'svc_order'); dbms_stats.gather_table_stats('[schema]', 'event'); end; / 

Esta consulta es una unión muy simple entre dos tablas pequeñas, pero con pnetworkingicados complejos. Es casi seguro que no desea volver a escribir significativamente todas sus consultas en busca de alguna syntax mágica que hará que todo se ejecute rápidamente. Sí, hay algunos casos raros donde BETWEEN no funciona bien, o mover los pnetworkingicados a una vista en línea ayuda, o replace la combinación con un INTERSECT podría ayudar. Pero eso me suena a progtwigción de culto de carga . Pregúntese, ¿por qué esos cambios hacen alguna diferencia? Si esos types de cambios siempre mejoraron el performance, ¿por qué Oracle no traduciría las consultas internamente?

Normalmente, debe intentar proporcionar mejor información al optimizador para que pueda tomar mejores decisiones. Por lo general, esto es tan simple como recostackr statistics con la configuration pnetworkingeterminada. Algunos pnetworkingicados son demasiado complejos, y para eso debe intentar usar un muestreo dynamic , como /*+ dynamic_sampling(6) */ . O tal vez agregar algunos histogtwigs . O quizás agregue una estadística de expresiones como esta:

 SELECT DBMS_STATS.CREATE_EXTENDED_STATS(null,'SVC_ORDER', '(((so.sots_ta = 'N') and (so.action_type = 0)) or ((so.sots_ta is null) and (so.action_type = 0)) or ((so.sots_ta = 'N') and (so.action_type is null)))' ) FROM DUAL; --Don't forget to re-gather statistics after this. 

Es probable que el optimizador esté subestimando el número de filas y utilizando un bucle nested en lugar de una combinación hash. Después de proporcionarle más información, idealmente comenzará a usar una combinación hash. Pero en algún momento, después de probar los methods anteriores y posiblemente muchas otras características, puede decirles qué tipo de unión usar. Cuál sería la sugerencia de @Florin Ghita, /*+use_hash(so e)*/ .