Oracle - in vs exists

 
Vista:

in vs exists

Publicado por Nauj (22 intervenciones) el 27/10/2001 13:11:50
Hola,
Tengo una select que quiero reducir en tiempo. La tengo hecha utilizando
el operador in y me han aconsejado rehacer la sql empleando exists
en lugar de in. Se supone que esto debería reducir el tiempo, pero
en mi caso lo aumenta, quiero saber si estoy utilizando correctamente
el operador exists o se puede escribir la select de un modo que sea más
eficiente. Si alguien me puede ayudar o dar un consejillo se
lo agradezco. La tabla2 tiene como 3 veces más registros que la tabla1
y todos los campos de búsqueda son clave primaria en tabla1.

IN:
select * from tabla1 where campo1 = '0209' and campo2 = '212'
and campo3 = '000'
and campo4||campo5||campo6 in
(select distinct campo4||campo5||campo6
from tabla2 where campo1 = '0209' and campo2 = '212'
and campo3 = '000')

EXISTS:
select * from tabla1 a where a.campo1 = '0209' and a.campo2 = '212'
and a.campo3 = '000'
and exists
(select *
from tabla2 b where b.campo1 = '0209' and b.campo2 = '212'
and b.campo3 = '000'
and b.campo4 = a.campo4 and b.campo5 = a.campo5
and b.campo6 = a.campo6)


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:in vs exists

Publicado por Harold (697 intervenciones) el 27/10/2001 17:19:34
El problema es que cuando haces un select * from table, lo que hace oracle internamente es un full table scan, lo que tienes que hacer es desde SQL (con version superior a la 3.3) le das un Set autotrace on
y ejecutas la consulta y te daras cuenta en donde es que esta bajando el rendimiento, tambien si esta utilizando indices o no (lo mas seguro es que no los este utilizando), si no la esta utilizando crea un indice sobre las columnas que estas haciendo el WHERE en ambas consultas y ejecutala nuevamente, el optimizador tiene que ejecutar la consulta utilizando el indice que encuentra disponible, si aun no lo hace puedes forzarla que utilize el indice al introducir en la consulta hints.

Desde el punto de vista de performance IN y EXITS, yo pienso que es mejor utilizar IN ya que el grupo de registros seleccionados en la consulta inicial se quedan en el SGA de la base de datos, comparando los demas registros en memoria, el exits, no estoy seguro pero me parece que utiliza segmentos temporales cuando esta haciendo el ordenamiento, y no lo hace precisamente en memoria, pero a como te decia no estoy muy seguro de eso.

Saludes
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:in vs exists

Publicado por DACH (258 intervenciones) el 30/10/2001 21:01:40
Solo quería añadir que los índices que definas si no los haz definido desde mi punto de vista debieran ser elegidos según la variabilidad de los datos, que significa esto, que los indices deben estar compuestos por aquellos campos de una tabla que más veces se repiten, la primary key es un indice por defecto por ejemplo, pero tb' no siempre lo más rápido es utilizar los datos a veces es necesario eliminar (desde la select ) los indices, en definitiva todo es muy relativo, dependiendo de la naturaleza de la consulta que estas realizando.

Salu2.-
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