2010-07-28 20 views

Respuesta

11

Es importante darse cuenta de que SQL es un lenguaje declarativo y no un imperativo. Usted describe en qué condiciones desea que se ajusten sus datos y no cómo deben ejecutarse esas comparaciones. El trabajo de la base de datos es encontrar la forma más rápida de darle una respuesta (una tarea asumida por query optimizer). Esto significa que un cambio aparentemente pequeño en su consulta puede dar como resultado un plan de consulta completamente diferente, que a su vez resulta en un comportamiento de tiempo de ejecución muy diferente.

La comparación = se puede convertir y optimizar de la misma manera que una unión simple en los dos campos. Esto significa que los índices normales se pueden usar para ejecutar la consulta muy rápido, probablemente sin leer los datos reales y usar solo los índices en su lugar.

Una comparación <> requiere un total de cartesian product para calcular y verificar la condición, por lo general (puede haber una manera de optimizar esto con el índice correcto, pero generalmente un índice no ayudará aquí). También generalmente devolverá muchos más resultados, lo que aumenta el tiempo de ejecución.

+0

Gracias por su explicación. Está mucho más claro ahora. Tu publicación en combinación con Pablo tiene mucho sentido. – jovany

1

Probablemente, la segunda consulta procesos manera filas más que la primera.

12

Porque son frases de SQL diferentes. En el primero, está uniendo dos tablas usando los campos Field1 y Table2. Probablemente devolviendo algunos registros.

En la segunda, su consulta probablemente regrese una gran cantidad de registros, ya que está haciendo una combinación cruzada, y muchas filas satisfarán su condición Field1 <> Table2.

Un ejemplo muy simplificado

Tabla1

Field1 
------ 
1 
2 
5 
9 

Tabla2

Table2 
------ 
3 
4 
5 
6 
9 

Consulta1 devolverá 2 ya que sólo 5 y 9 son comunes.

Query2 devolverá 18 ya que muchas filas de unión cruzada contarán.

Si tiene una tabla con muchos registros, llevará un tiempo procesar su segunda consulta.

+0

¡Interesante! Tu publicación se parece a la de Joachim Sauer. Tu publicación y su combinación son una buena combinación. – jovany

1

(Pensando en un similar question)

¿Estás tratando de contar las filas de Table1 para los que no hay ningún registro coincidente en Table2?

Si es así usted podría utilizar este

SELECT COUNT(*) FROM Table1 TB1 
WHERE NOT EXISTS 
    (SELECT * FROM Table2 TB2 
     WHERE TB1.Field1 = TB2.Field2) 

o esta por ejemplo

SELECT COUNT(*) 
FROM 
(
SELECT Field1 FROM Table1 
MINUS 
SELECT Field2 FROM Table2 
) T