Utilizamos cookies propias y de terceros para mejorar la experiencia de navegación, y ofrecer contenidos y publicidad de interés.
Al continuar con la navegación entendemos que se acepta nuestra política de cookies.
Iniciar sesión Cerrar
Correo:
Contraseña:
Entrar
Recordar sesión en este navegador
Iniciar sesiónIniciar sesiónCrear cuentaCrear cuenta

Oracle - Forzar uso de indice

  Imprimir  
Vista:

Forzar uso de indice

Publicado por Paco (1 intervención) el 12/03/2009 13:41:56
Hola, tengo una select que me va muy lenta y creo que es porque no usa un indice que tengo creado. El problema me lo da al añadir una condicion. Con la siguiente condicion la select va muy rapida puesto que tengo como PK de la tabla sert los campos ID y FECHA_ALTA:

AND sert.ID=s.ID AND sert.FECHA_ALTA<=s.FECHA

El problema es al añadirle esta condicion

AND sert.FECHA_BAJA>s.FECHA

Con el explain plan me he fijado que al añadir esta ultima condicion deja de usar el indice de la PK y pasa a hacer un FULL. He creado otro indice con (ID,FECHA_ALTA,FECHA_BAJA) y al ejecutar tampoco usa ningun indice y sigue haciendo un FULL.

¿Alguien tiene idea de porque puede suceder o al menos indicarme como puedo forzar a que use el indice creado con los 3 campos?

Gracias de antemano...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Forzar uso de indice

Publicado por Pedro (38 intervenciones) el 12/03/2009 17:52:15
Bueno para empezar deberias haber puesto el total de la select para ver todas las tablas que usas y las condiciones que utilizas.

sobrentendere que utilizas esto

select *
from tabla 1 sert, tabla2 s
where sert.ID=s.ID
AND sert.FECHA_ALTA<=s.FECHA
AND sert.FECHA_BAJA>s.FECHA

esto le va a provocar un full como una casa con nested loops ( o sea que por cada registro de la primera tabla te hace un full de la segunda por lo que si tiene muchos registros no termina nunca)
En estos casos lo mas recomendable es utilizar el hint correspondiente para que te haga HASH_JOIN,
para ello se te kedaria una cosa asi

select /*+use_hash (sert s)*/ *
from tabla 1 sert, tabla2 s
where sert.ID=s.ID
AND sert.FECHA_ALTA<=s.FECHA
AND sert.FECHA_BAJA>s.FECHA

Pero ten en cuenta que esto no es inmediato, puesto que el full a las dos tablas lo tiene que hacer por narices. Aunque esto si termina.

Los indices solo sirven cuando kieres ir directamente a un grupo de registros en cuestión, partiendo de un dato en concreto. Lo que debes evaluar es el volumen de datos con el cual vas a tratar y si merece la pena o no crearte un indice, de todas formas el indice que has creado no te sirviria de nada puesto que si el id ya es pk, no tiene sentido incluirlo en otro puesto que por si mismo ya es un indice, por lo que lo que tenias hecho jamas se debe de hacer.

Pero recuerda que no has puesto la select completa, es una deducción, de todas formas espero que te sirva
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Forzar uso de indice

Publicado por Rita (1 intervención) el 22/03/2009 09:55:16
Hola:
Contestando a tu pregunta, sin hacer suposiciones de tu SELECT. Si quieres forzar el uso del índice usa el siguiente hint:
SELECT */+ INDEX (NombreTabla NombreIndice) */ .......
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Forzar uso de indice

Publicado por Waldo Navarro (1 intervención) el 03/11/2010 20:19:53
Averigua que es el clustering_factor..... eso te puede ayudar a entender porque a veces no se va por el indice de las tablas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar