2008-10-14 15 views
6

En tablas grandes en MSSQL; seleccionar columnas específicas da como resultado una mayor velocidad de la consulta. ¿Se aplica lo mismo a Linq para SQL?Linq a SQL: seleccione optimización

Sería esto:

var person = from p in [DataContextObject].Persons 
      where p.PersonsID == 1 
      select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode }; 

ser más rápido que esto:

var person = from p in [DataContextObject].Persons 
      where p.PersonsID == 1 
      select p; 

...?

Respuesta

6

Recomiendo encarecidamente LinqPad. Es gratis y te permite ejecutar consultas LINQ dinámicamente. Cuando también puede ver el SQL que se genera.

Lo que verá es que la consulta LINQ traducirá la primera consulta en seleccionar solo esas columnas. Entonces es más rápido.

4

Si está limitando el tamaño del conjunto de resultados seleccionando solo unas pocas columnas específicas, entonces SÍ tendrá un efecto.

EDITAR ading aclaración del comentario

¿Cómo es esto mejor, se reducirá el tamaño de los datos resultantes de regresar de SQL y se reducirá el tamaño de los objetos que se utilizan para almacenar los resultados en memoria.

Esto se debe a que, al final, LINQ to SQL genera SQL, por lo que existen los mismos beneficios de rendimiento.

+0

Resultando en una disminución de la asignación de memoria? O una mayor velocidad? – roosteronacid

+0

¡Ambos! SQL Server responderá más rápido, lo que limitará los datos transmitidos, y reducirá el tamaño de la colección que contiene los resultados, reduciendo la memoria –

1

Creo que lo mismo aplica, porque LINQ to SQL traduce las operaciones de consulta Linq a comandos SQL.

1

Además de lo que han dicho los demás, la nueva estructura sin nombre será un objeto mucho más liviano que el objeto Person; sería mucho más rápido, incluso si seleccionó todas las columnas. (La persona tiene métodos/campos, etc. para admitir la escritura del objeto en la base de datos. El tipo sin nombre no).

3

Aquí hay 3 aspectos con "más rápido".

  1. menos datos transmitidos significa más rápido. Por otro lado se no conseguir que la significativamente más rápido, menos que se seleccione más de una fila o si su persona contiene algunos otras columnas "pesados" - varchars larga, imagen, etc.
  2. como J . Curran señaló, menos memoria asignada significa más rápido. La misma observación que en 1. se aplica aquí.

  3. Su consulta se ejecuta más rápido si tiene un índice que contiene todas las columnas seleccionadas (o se adjunta a partir de SQL Server 2005). En este caso, el motor de SQL Server no necesita cargar la página con la fila en la memoria, si aún no está allí.

En lo personal no me molestaría tratando de optimizar mis consultas de esta manera (a menos que, como ya he dicho sus filas contienen datos binarios o cadenas muy largas que no necesitas), en parte porque si más adelante decide que si desea obtener más información sobre esta Persona seleccionada, deberá cambiar su código de acceso a la BD vs.simplemente accediendo a una propiedad en su clase POCO/anónima.

1

Si tiene columnas que son muy grandes, como binarios e imágenes, puede marcar una diferencia significativa, por eso LINQ to SQL le permite especificar la carga de retraso para ciertas columnas para que pueda seleccionar objetos enteros sin realizar ' seleccione nuevas 'proyecciones.