2010-08-18 26 views
7

Ok, así que tengo una consulta:servidor SQL 'en' o 'o' - que es más rápido

select distinct(a) 
from mytable 
where 
b in (0,3) 

¿Qué va a ser más rápido, lo anterior o

select distinct(a) 
from mytable 
where 
b = 0 
or 
b = 3 

¿Hay una regla general?

Gracias

+0

¿No lo intentó usted mismo? –

Respuesta

4

Tanto IN y OR hará una consulta para b = 0 seguido por uno para b = 3, y luego hacer una combinación de mezcla de los dos conjuntos de resultados, y finalmente filtrar los duplicados.

Con IN, los duplicados no tiene mucho sentido, porque b no pueden ser ambos 0 y 3, pero el hecho es que IN se convertirá en b = 0 OR b = 3, y con OR, duplicados hacer tiene sentido, porque podría tener b = 0 OR a = 3, y si uniera los dos conjuntos de resultados por separado, podría terminar con duplicados para cada registro que coincidiera con ambos criterios.

Por lo tanto, siempre se realizará un filtrado duplicado, independientemente de si está usando IN o OR. Sin embargo, si usted sabe de antemano que no tendrá ningún duplicados - que suele ser el caso cuando se está utilizando IN - entonces usted puede ganar un poco de rendimiento mediante el uso UNION ALL que no filtrar los duplicados:

select distinct(a) 
from mytable 
where 
b = 0 

UNION ALL 

select distinct(a) 
from mytable 
where 
b = 3 
7

Por lo que yo sé, IN convierte a OR. Entonces el rendimiento es el mismo. Solo una manera más corta de escribirlo.

6

Esperemos que en este sencillo ejemplo no tenga ninguna importancia la versión que use (ya que el optimizador de consultas debería convertirlas en consultas equivalentes bajo el capó), sin embargo, hay una buena probabilidad de que dependa de los índices que usted tener en mytable. Le sugiero que ejecute ambas consultas en Sql Server Management Studio después de haber activado "Incluir plan de ejecución real" y compare los resultados para determinar qué consulta tiene el "costo" más bajo en su escenario.

Para hacer esto:

  1. Deja tus consulta (s) en una nueva ventana de consulta SQL Sever Management Studio
  2. Haga clic derecho sobre la ventana en el espacio que ha escrito en
  3. Haga clic en " incluir plan de ejecución real"
  4. ejecutar la consulta como lo haría normalmente

el fondo 'resultados' de la mitad de la ventana ahora tendrá una tercera pestaña que muestra "Plan de ejecución" que debe contener dos "diagramas de flujo", uno para la primera consulta y otro para la segunda. Si los dos son idénticos, entonces el Servidor SQL ha tratado las dos consultas como equivalentes y, por lo tanto, debe elegir la forma que usted y sus colegas prefieran.

+0

+1. FWIW, hice esto y los planes son idénticos. – harpo

+0

@harpo, yeup, fue mi manera larga de decir "así es cómo resolverlo tú mismo, ya que sé que será lo mismo pero obtendrás más de lo que descubres" para el OP =) – Rob

Cuestiones relacionadas