transact test query full convert sql performance linq-to-sql

test - sql server to linq



Linq a SQL: selección de optimización (6)

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

EDITAR aclaración ading de comentario

Cómo es esto mejor, reducirá el tamaño de los datos resultantes devueltos por SQL Y reducirá el tamaño de los objetos utilizados para almacenar los resultados en la memoria.

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

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?

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;

...?


Además de lo que han dicho los demás, la nueva estructura sin nombre será mucho más liviana 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 lo hace).


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


Hay 3 aspectos con "más rápido" aquí.

  1. menos datos transmitidos significa más rápido. Por otro lado, no será mucho más rápido, a menos que selecciones más de una fila o si tu Persona contiene algunas otras columnas "pesadas", varcharres largos, imágenes, etc.
  2. como señaló J. Curran, 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 adjuntas desde 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í.

Personalmente, no me molestaría en tratar de optimizar mis consultas de esta manera (a menos que, como dije, sus filas contengan datos binarios o cadenas muy largas que no necesita), en parte porque si luego decide que desea tener más información sobre esta Persona seleccionada, necesitaría cambiar su código de acceso a la BD, en lugar de acceder a una propiedad en su clase POCO / anónima.


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.


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