2009-07-13 30 views
6

En T-SQL, ¿qué es más rápido?¿Qué es más rápido EN O?

DELETE * FROM ... WHERE A IN (x,y,z) 

O

DELETE * FROM ... WHERE A = x OR A = y OR A = z 

En mi caso x, y, z son parámetros de entrada para el procedimiento almacenado. Y estoy tratando de obtener el rendimiento de mis declaraciones DELETE e INSERT de la mejor manera posible.

Respuesta

11

"IN" se traducirá a una serie de "O" s ... si mira el plan de ejecución para una consulta con "IN", verá que se ha expandido.

Mucho más limpia para usar "IN" en mi opinión, especialmente en consultas más grandes, lo hace mucho más legible.

+0

Thnx, en el plan de ejecución vi que costaría exactamente la misma cantidad de tiempo de CPU. – Zyphrax

+0

Esto no es verdad. En no se traduce como un serise de ors. Será mejor que perfile su consulta y realmente vea el resultado. La mayoría de las veces, EXISTS es más rápido que IN. Pero O * debe * ser más rápido que ambos. Sin embargo, depende de los índices. –

+0

@Frank, estamos hablando de IN con listas de valores, no de IN con subconsultas. –

0

Debe ser exactamente igual. La mayoría de RDMBS transalte IN a ORs.

Por supuesto, si se tiene en cuenta la traducción del INsORs a ser de alto consumo de tiempo, la frase con ORs es más rápido ;-)

Actualización: que estoy teniendo en cuenta que es una columna A.

1

Si A es un cálculo, se realizará una vez con IN y N veces con OR.

14

No lo pienses; perfil.

Te pido que no confíes en la intuición, la tuya o la de los demás, cuando consideres cuestiones de velocidad. En su lugar, pruebe ambas opciones, con algún tipo de medición de perfilado/tiempo de ejecución, y averigüe, que es más rápido en sus circunstancias.

+1

+1 Gracias por respaldar lo que trato de decir. :-) –

4

Escriba dos procedimientos almacenados, uno usando IN, el otro usando OR, en un servidor de prueba. Ejecute cada procedimiento 10,000 (o 1,000,000, o lo que sea) veces, y compare los tiempos.

En general, esta es prácticamente la única "manera" de tener una buena respuesta a la pregunta de qué enfoque es más rápido: escribir casos de prueba de tiempo simple y ejecutarlos muchas, muchas veces.

3

En SQL Server, el optimizador generará planes idénticos para estas consultas.

2

que debe generar el mismo plan exacto de mi experiencia

echar un vistazo al plan

1

Independientemente de si A es un cálculo o una columna, se parece a SQL Server 2005 convierte IN a cláusulas OR .

+0

También podría convertirlo en una unión, en el caso en que el contenido de su IN sea el resultado de otra instrucción SELECT. –

1

El más rápido absoluto en SQL Server es utilizar un BORRADO con una UNIÓN INTERNA. Con tres valores no notarás la diferencia, pero con más valores (estamos haciendo varios miles) la diferencia es fenominal. Podrías esconder tus valores en una tabla de temporay luego unirte a eso.

E.g.

DELETE C 
FROM Customer AS C INNER JOIN #ValuesToDelete AS D ON C.CustID = D.CustID 

También puede agregar una cláusula where opcional.

Cuestiones relacionadas