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
Crear cuenta

Oracle - Forzar uso de indice

Vista:
Me gusta: Está pregunta es útil y esta clara
0
No me gusta: Está pregunta no esta clara o no es útil
 
Asunto:Forzar uso de indice
Autor:Paco (1 intervención)
Fecha:12/03/2009 13:41:56
Url:
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...
Responder Subir
información
Otras secciones de LWP con contenido similar...
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:RE:Forzar uso de indice
Autor:Pedro (38 intervenciones)
Fecha: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
Comentar Subir
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:RE:Forzar uso de indice
Autor:Rita (1 intervención)
Fecha: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.
Comentar Subir
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:RE:Forzar uso de indice
Autor:Waldo Navarro (1 intervención)
Fecha: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.
Comentar Subir