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

Qué hace un "+ 0 ="

Estas en el tema de Qué hace un "+ 0 =" en el foro de Oracle en Foros del Web. Una pegunta para los conocedores de Oracle (a pesar de haber hecho los cursos de DBA nivel 1 y 2, ercién estoy haciendo mis priemras ...
  #1 (permalink)  
Antiguo 21/06/2012, 09:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Qué hace un "+ 0 ="

Una pegunta para los conocedores de Oracle (a pesar de haber hecho los cursos de DBA nivel 1 y 2, ercién estoy haciendo mis priemras armas en este DBMS).
El caso es que quiero entender qué hace esto:
Tengo dos tablas en un JOIN, donde el WHERE tiene esta relacion:
Código SQL:
Ver original
  1. va.idvendedor + 0 = ve.idvendedor

- Obviamente VA y VE son los alias de las tablas.
- VE es tabla base y idvendedor es su PK.
- VA es tabla secundaria y idvendedor es una FK declarada que referencia a VE.

¿Qué es lo que hace este "+ 0 = " que se le agregó a la relación del JOIN?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #2 (permalink)  
Antiguo 21/06/2012, 12:56
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 5 meses
Puntos: 43
Respuesta: Qué hace un "+ 0 ="

A lo mejor tiene su sentido/utilidad, pero salvo que sea otra manera sintactica de poner un OUTER JOIN, no le veo sentido.

A ver si huesos o matanga que son los gurús de aquí tienen alguna idea de lo que preguntas, que me ha entrado la curiosidad.

Saludos
  #3 (permalink)  
Antiguo 21/06/2012, 13:28
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Qué hace un "+ 0 ="

Señores, aunque no tengo una respuesta, el tema resulta bastante interesante.

Probé con una consulta que recurre a varias tablas y utiliza varios join de este tipo. Realicé un explain plan de la consulta con " + 0 =" y sin el mismo y el costo, cardinalidad y bytes utilizados de la consulta mejora bastante haciendo uso de este juego de caracteres.

Intentaré investigar un poco. Por ahora quedamos en manos de matanga. :)
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 21/06/2012, 14:31
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Qué hace un "+ 0 ="

Investigando un poco me encontré con una explicación (Me hubiese gustado que fuera en la doc de oracle) a este tema.

SELECT EMP.*,DEPT.DNAME FROM EMP WHERE EMP.DEPTNO = DEPT.DEPTNO + 0;

The + 0 (which is illogical) was used to disable the rule to use the index on the DEPT.DEPTNO column because it was
involved in a function and to prefer the nonunique index on EMP.DEPTNO. It looked ugly, but it worked in situations
where an application and the indexes couldn't be tuned anymore.


En pocas palabras, entiendo que hasta la versión 7, oracle realizaba sus planes de ejecución mediante RBO (Rule Based Optimizer)
Posterior a esta versión trabaja por defecto en CBO (Cost Bassed Optimizer) que permite obtener el plan de ejecución mas optimo
para la consulta haciendo uso de las estadisticas de las tablas.

Este juego de caracteres parece ser utilizado en versiones anteriores para deshabilitar ciertas reglas y guiar un poco a oracle en la construcción de su plan de ejecución.

La fuente es:
http://www.techrepublic.com/article/...le-10g/5219086

Espero aclare algunas dudas.

Saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 21/06/2012, 15:11
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 5 meses
Puntos: 43
Respuesta: Qué hace un "+ 0 ="

AHora parece que tiene sentido

:)

SI tengo tiempo en el curro, intentaré profundizar un poco con esto.

Gracias, Huesos.
  #6 (permalink)  
Antiguo 22/06/2012, 07:12
 
Fecha de Ingreso: enero-2007
Ubicación: Cali - Valle
Mensajes: 135
Antigüedad: 17 años, 10 meses
Puntos: 4
Respuesta: Qué hace un "+ 0 ="

Hola huesos52

Siguiendo con este tema, entonces, esto funcionaria en las versiones 11 o 12??


Saludos
  #7 (permalink)  
Antiguo 22/06/2012, 08:11
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Qué hace un "+ 0 ="

Yo creería que no tiene mucho sentido. Posterior a la versión 7, el optimizer se encuentra configurado por defecto como CBO y según la pobre documenación encontrada, este comando es usado para deshabilitar reglas donde el optimizer se encuentra como RBO.

Sin embargo, me queda la duda de la prueba en los planes de ejecución que hice. Fue en una base de datos 10g y este juego de caracteres mejoró un poco los costos y la cardinalidad de la consulta.

A la espera de los comentarios de Matanga o de la investigación de JC3000 o gnzsoloyo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 22/06/2012, 10:44
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 5 meses
Puntos: 43
Respuesta: Qué hace un "+ 0 ="

No he podido mirar nada, pero lo tengo en la agenda.

De todas maneras, el hacer una conversion de un campo indice obliga a Oracle a buscar otras vias ( si no las hay, te hace un full scan de la tabla ) y quizás los tiros vayan por ahí.

Recuerdo una discusión que tuve con un programador porque me decia que la BBDD estaba mal, que tenía una query que le tardaba un huevo y accedia por un campo indice......... hasta que descubrí que hacía una conversión de un date a un char y le hacía un fullscan de lo mejorcito
  #9 (permalink)  
Antiguo 22/06/2012, 17:18
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Respuesta: Qué hace un "+ 0 ="

La condición campo +0 = valor solo tiene impacto en el uso de índices, y era útil cuando se quería forzar un fullscan con el optimizador basado en Regla (RBO), es decir:

1. El hint FULL evita el índice, pero cualquier hint (excepto RULE) provoca que el optimizador resuelva la consulta con CBO.

Código:
create table tabla1 (campo1 number);
create index ind1 on tabla1(campo1);
select /*+ full(tabla1) */ campo1 
 from tabla1 where campo1=valor;
2. El hint RULE (también está el parámetro OPTIMIZER_MODE=RULE) provoca que el optimizador resuelva las consultas con RBO, y en este caso, la única forma de evitar el índice es aplicando una función nula al campo.

Código:
create table tabla1 (campo1 number);
create index ind1 on tabla1(campo1);
select /*+ rule */ campo1 
 from tabla1 where campo1 +0 =valor;
En cualquier caso, esto ya no tiene mucho uso, el modo RBO está completamente deprecado, y el modo CBO ha evolucionado tanto en las últimas versiones que rara vez se necesita forzar su comportamiento con hints.

Saludos
  #10 (permalink)  
Antiguo 25/06/2012, 07:34
 
Fecha de Ingreso: enero-2007
Ubicación: Cali - Valle
Mensajes: 135
Antigüedad: 17 años, 10 meses
Puntos: 4
Respuesta: Qué hace un "+ 0 ="

Hola...

Muchas gracias a todos por la aclaración sobre el tema.

Saludos.

Etiquetas: tabla
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:23.