Domanda

Sto avendo alcuni problemi con Entity Framework. Sto eseguendo un semplice selezionare da una vista nel database. Tuttavia, quando ho visualizzare l'SQL che genera EF, si sta eseguendo la query due volte con una selezione da. E 'questo il modo in cui si suppone di operare? Mi sembra molto inefficiente.

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

Questo viene tradotto nelle seguenti 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]

Questa sembra essere molto inefficiente, soprattutto quando la tabella contiene circa 250 milioni di righe come il nostro. Inoltre, se virare un .Prendere (2000) sulla fine del codice, si mette semplicemente un 'selezionare Top 2000' sul solo la prima di selezione. Così, il che rende selezionare la Top 2000 della parte interna di selezione che è l'intera tabella.

Ogni pensiero su questo?

È stato utile?

Soluzione

  

Questo sembra essere molto inefficiente

Non penso così ... SELECT esterna è solo una proiezione (in realtà una proiezione di identità) di SELECT interna, e una proiezione ha un impatto sulle prestazioni trascurabile ...

Per quanto riguarda la clausola TOP 2000, il fatto che è sulla SELEZIONA esterno non significa che il DB leggerà tutte le righe della SELEZIONA interno; li leggerà fintanto che sono richiesti da SELECT esterno, quindi arrestare.

Basta provare a eseguire la query manualmente, con o senza SELECT esterna:. Scommetto che non troverete alcuna differenza significativa in termini di prestazioni

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top