marco de la entidad: consulta de ejecución 'seleccionar de' sin motivo
-
19-09-2019 - |
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?
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