Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Consulta Lenta

Estas en el tema de Consulta Lenta en el foro de Oracle en Foros del Web. Hola a Todos: Se me ha presentado el siguiente problema con una consulta. La que paso a continuación retorna 1,4 millones de registros, pero demora ...
  #1 (permalink)  
Antiguo 22/01/2009, 10:46
Avatar de todotresde  
Fecha de Ingreso: febrero-2005
Mensajes: 6
Antigüedad: 19 años, 9 meses
Puntos: 0
Consulta Lenta

Hola a Todos:

Se me ha presentado el siguiente problema con una consulta. La que paso a continuación retorna 1,4 millones de registros, pero demora entre 20 y 30 minutos para ejecutarse. La consulta es la siguiente:

SELECT
distinct m.COD_MOVIMIENTO,
m.COD_TRANSAC,
m.FEC_MOVIMIENTO,
m.COD_ACTOR,
m.COD_TIPACTOR,
m.COD_TIPMOV,
m.MONTO,
m.SALDO_FINAL,
m.COD_USUASE_ALTA,
m.FEC_ALTA,
NRO_FACTURA,
FROM
SE_MOVIMIENTOS m
WHERE
AND FEC_MOVIMIENTO >= to_date ('01/01/2009', 'dd/mm/yyyy')
AND FEC_MOVIMIENTO <= to_date ('30/01/2009', 'dd/mm/yyyy')
ORDER BY m.FEC_MOVIMIENTO DESC;

El campo FEC_MOVIMIENTO esta indexado, y tarda lo mismo si quito el ORDER BY. dada que la tabla supera los 60 millones de registros, que posibilidad existe de optimizar esto?

Muchas Gracias a Todos!
  #2 (permalink)  
Antiguo 22/01/2009, 19:35
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 8 meses
Puntos: 7
Respuesta: Consulta Lenta

asi a ojo de buen cubero (como se dice aca en mexico) trata de sacar ese distinct - todos los campos, tal ves si lo hicieras directo sobre la llave de la tabla mejorarian los tiempos, algo como

...
FROM
SE_MOVIMIENTOS m,
(select distinct cod_movimiento, cod_trasaccion from movimientos) d_m
WHERE
m.cod_movimiento = d_m.cod_movimiento and
m.cod_trasaccion = d_m.cod_trasaccion
...
__________________
Blogzote.com :-) Mi blog
  #3 (permalink)  
Antiguo 27/01/2009, 13:51
Avatar de todotresde  
Fecha de Ingreso: febrero-2005
Mensajes: 6
Antigüedad: 19 años, 9 meses
Puntos: 0
Respuesta: Consulta Lenta

Gracias kikolice por la respuesta. Pero me pasaron la siguiente solucion:

La tabla SE_MOVIMIENTOS tiene varios indices, entre ellos esta


IDX_ACTOR_TACTOR_FMOVIMIENTO (cod_actor, cod_tipactor, fec_movimiento)
IDX_SE_MOV_FECHA(fec_movimiento)


En el where de tu consulta tenes:

m.COD_TIPMOV != 7
AND m.COD_TIPMOV != 9
AND FEC_MOVIMIENTO >= to_date ('01/01/2009', 'dd/mm/yyyy')
AND FEC_MOVIMIENTO <= to_date ('30/01/2009', 'dd/mm/yyyy')
AND COD_TIPMOV = 5
AND m.COD_ACTOR = 2744

Los campos que nos interesan con COD_ACTOR y FEC_MOVIMIENTO

Al ser cod_actor una igualdad (cod_actor = 2744) Oracle elige el indice IDX_ACTOR_TACTOR_FMOVIMIENTO para resolver la consulta. Como el campo cod_tipactor no lo nombro en el WHERE el resto de los campos del indice no son usados.

Para obligar a Oracle que elija el índice por FEC_MOVMIENTO ( que es un rango y no una igualdad) tengo 2 opciones:

1) Le aplico una operación al campo COD_ACTOR para invalidar el indice que comienza con COD_ACTOR:
AND m.COD_ACTOR+0 = 2744
2) Utilizo un Hint especifico para indicarle que use ese índice:
SELECT /*+ INDEX(m IDX_SE_MOV_FECHA */


Asi la consulta demora segundos.


Gracias Carolina!!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:06.