Pregunta

Tengo una consulta SELECT de varias mesas que se compara con los valores de columna en sí, como a continuación:

SELECT * FROM table1 t1,table2 t2
      WHERE t1.col1=t2.col1  --Different tables,So OK.
      AND t1.col1=t1.col1    --Same tables??
      AND t2.col1=t2.col1    --Same tables??

Esto parece redundante para mí. Mi consulta es, ¿la eliminación de ellos tienen algún impacto en la lógica / rendimiento?

Gracias de antemano.

¿Fue útil?

Solución

Esto parece redundante, su único efecto es la eliminación de las líneas que tienen valores NULL en estas columnas. Asegúrese de que las columnas no son NULL antes de retirar esas cláusulas.

Si las columnas son anulable puede reemplazar de forma segura con estas líneas (más fácil de leer, fácil de mantener):

  AND t1.col1 IS NOT NULL
  AND t2.col1 IS NOT NULL


Actualizar siguiente comentario de Jeffrey

Tienes toda la razón, no sé cómo no me veo a mí mismo: la condición de unión t1.col1=t2.col1 implica que sólo las filas con las columnas no se considerará nula unión. Las cláusulas tx.col1=tx.col1 por lo tanto son completamente redundantes y se pueden eliminar de forma segura.

Otros consejos

No eliminarlos hasta que entienda el impacto. Si, como otros están señalando, no tienen ningún efecto sobre la consulta y probablemente están optimizados a cabo, no hay daño en dejándolos allí, pero pueden ser malo en la eliminación de ellos.

No trate de arreglar algo que está funcionando hasta que su absolutamente seguro de que no está rompiendo algo más.

La razón por la que menciono esto es porque hemos heredado una aplicación de informes legado que tenía exactamente esta construcción, a lo largo de las líneas de:

where id = id

Y, siendo un compañero sensible, que se deshizo de ella, sólo para descubrir que el motor de base de datos no fue el único uso de la consulta.

primero fue a través de un pre-procesador que extrae cada columna que existían en una cláusula where y se aseguró de que fueron indexados. Básicamente una base de datos de sintonización automática.

Bueno, imagina nuestra sorpresa en la siguiente iteración cuando la base de datos se redujo a una fracción de su velocidad cuando los usuarios estaban haciendo consultas ad-hoc en el campo id: -)

resulta que esto era una opción de venta en kludge por el equipo de soporte anterior para asegurar ad hoc común consultas estaban usando columnas indexadas, así, a pesar de que ninguna de nuestras consultas estándar hacía.

Por lo tanto, no estoy diciendo que no pueden hacerlo, sólo que sugiere que podría ser una buena idea para entender por qué se puso en primer lugar.

  1. Sí, las condiciones son obviamente redundante ya que son! Idéntica

    SELECT * FROM table1 t1,table2 t2
    WHERE t1.col1=t2.col1
    
  2. Pero es necesario al menos uno de ellos. De lo contrario, tendría una combinación cartesiana en sus manos: cada fila de la tabla 1 se unió a cada fila de tabla2. Si tabla1 tenía 100 filas, y tabla2 tenido 1.000 filas, la consulta resultante volvería 100.000 resultados.

    SELECT * FROM table1 t1,table2 t2 --warning!
    
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top