Pregunta

Estoy teniendo algunos problemas con el marco de la entidad. Estoy ejecutando un selecto sencilla desde un punto de vista en la base de datos. Sin embargo, cuando veo el SQL que genera EF, se ejecuta la consulta utilizando dos veces al SELECT. ¿Es esta la forma en que se supone que debe funcionar? Parece muy ineficiente.

var reads = (from rt in ctx.C2kReadsToTransfer
                     where rt.ReadDt > fromDate
                     && rt.ReadDt < toDate
                     select rt);

Esto se traduce en el siguiente SQL

SELECT 

 [Extent1].[AMRID] AS [AMRID]
 , [Extent1].[Comments] AS [Comments]
 , [Extent1].[ExternalSystemType] AS [ExternalSystemType]
 , [Extent1].[LastReadDt] AS [LastReadDt]
 , [Extent1].[ReadDt] AS [ReadDt]
 , [Extent1].[Reading] AS [Reading]
 , [Extent1].[Units] AS [Units]
 , [Extent1].[Transferred] AS [Transferred]



 FROM 
     (SELECT 
      [ReadsToTransfer].[AMRID] AS [AMRID]
      , [ReadsToTransfer].[Comments] AS [Comments]
      , [ReadsToTransfer].[ExternalSystemType] AS [ExternalSystemType]
      , [ReadsToTransfer].[LastReadDt] AS [LastReadDt]
      , [ReadsToTransfer].[ReadDt] AS [ReadDt]
      , [ReadsToTransfer].[Reading] AS [Reading]
      , [ReadsToTransfer].[Transferred] AS [Transferred]
      , [ReadsToTransfer].[Units] AS [Units]
      FROM [dbo].[ReadsToTransfer] AS [ReadsToTransfer])
    AS [Extent1]

Eso parece ser muy ineficiente, especialmente cuando la tabla contiene cerca de 250 millones de filas como el nuestro. También, si un .Tomar Tack (2000) en el extremo del código, simplemente se pone un 'SELECT TOP 2000' únicamente en la primera selección. De este modo, por lo que es seleccionar el 2000 parte superior del interior de selección que es toda la tabla.

¿Alguna idea sobre esto?

¿Fue útil?

Solución

  

Eso parece ser muy ineficiente

No me lo creo ... la SELECT externa es sólo una proyección (en realidad una proyección de identidad) de la SELECT interna, y una proyección tiene un impacto en el rendimiento insignificante ...

En cuanto a la cláusula TOP 2000, el hecho de que es en la SELECT externa no significa que el PP va a leer todas las filas de la SELECT interna; se va a leer, siempre y cuando sean solicitados por la SELECT externa, luego se detiene.

Sólo trato de ejecutar la consulta manualmente, con o sin la SELECT externa:. Apuesto a que no encontrará ninguna diferencia significativa en el rendimiento

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top