2011-07-05 19 views
7

¿La base de datos rompe el bucle de selección tan rápido como tiene un registro cuando usa Top 1?Top 1 más rápido si solo selecciona una fila

Para que select top 1 * from customer where cusId = 1234

es más rápido que select * from customer where cusId = 1234 ?

cusId es único, por lo que MSSql entiende para hacerlo "más rápido" sin top 1?

+1

CON (FASTFIRSTROW) puede ayudar a veces * *. No es raro para mí tener: WITH (NOLOCK FASTFIRSTROW) cuando las lecturas sucias son aceptables. – SQLMason

+1

Sospecho que obtendrá mejoras de rendimiento y de mantenimiento más notables al no usar * (incluso si está utilizando realmente todas las columnas) y al hacer referencia al cliente correctamente (dbo.customer), que preocuparse por agregar este operador superior sin sentido a la consulta. –

Respuesta

4

Si cusId es una clave principal, ambas deberían ser las mismas en relación con el rendimiento.

EDIT:

Sólo se le agrega el techo con 1 Si usted tiene un índice único que devolverá 1 resultado de todos modos.

Será diferente si tiene un pedido por algo que no le interesa en una sola fila.

MÁS:

No hay looping involucrados, a menos que haya un recorrido de tabla implicada y no existe un índice en absoluto para cusId. En ese caso, TOP 1 no puede ayudarlo de todos modos.

+0

¿Qué sucede cuando 'cusIs' no es una clave principal? –

+4

+1 - si compara los planes de ejecución, la 'parte superior' tiene un paso adicional, pero el costo es demasiado pequeño para contar. –

0

En mi opinión select * from customer where cusId = 1234 habrá más faster..b/c que tiene una operación menos de realizar que la primera ...

+0

Es cierto, pero la diferencia es muy pequeña (ya que cusId es único) que puede ignorarse. – Kamyar

Cuestiones relacionadas