2015-05-18 11 views
5

Sto utilizzando EntityFramework per selezionare i dati dal mio database mssql. La mia domanda simile a questa:EntityFramework 6.1.1 con problema Linq Performance

int param = 123456; 
using (var context = new DatabaseContext()) 
{ 
    var query = context.Table.AsQueryable(); 
    var result = query.Where(o => o.Id == param).ToList(); 
} 

Questa query richiede circa 10 secondi.

using (var context = new DatabaseContext()) 
{ 
    var query = context.Table.AsQueryable(); 
    var result = query.Where(o => o.Id == 123456).ToList(); 
} 

Questa query richiede meno di 1 secondo.

Ho appena scoperto che EntityFramework genera due query diverse.

Domanda 1:

SELECT TOP (20) 
[Project1].[Id] AS [Id], 
[Project1].[Name] AS [Name], 
FROM (SELECT [Project1].[Id] AS [Id], [Project1].[Name] AS [Name], row_number() OVER (ORDER BY [Project1].[Id] DESC) AS [row_number] 
    FROM (SELECT 
     [Extent1].[Id] AS [Id], 
     [Extent1].[Name] AS [Name] 
     FROM [dbo].[Table] AS [Extent1] 
     WHERE [Extent1].[Id] = @p__linq__0 
    ) AS [Project1] 
) AS [Project1] 
WHERE [Project1].[row_number] > 0 
ORDER BY [Project1].[Id] DESC 
-- p__linq__0: '2932323' (Type = Int32, IsNullable = false) 

Domanda 2:

SELECT TOP (20) 
[Filter1].[Id] AS [Id], 
[Filter1].[Name] AS [Name] 
FROM (SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name], row_number() OVER (ORDER BY [Extent1].[Id] DESC) AS [row_number] 
    FROM [dbo].[Table] AS [Extent1] 
    WHERE 2932323 = [Extent1].[Id] 
) AS [Filter1] 
WHERE [Filter1].[row_number] > 0 
ORDER BY [Filter1].[Id] DESC 

Esiste un modo per accelerare il prima uno o un altro modo per farlo?

+0

Puoi mostrare le query che vengono generate per ognuna? Inoltre, perché non stai interrogando direttamente il 'context'? Perché usare 'AsQueryable()'? –

+5

'AsQueryable()' è ridondante in entrambi i casi – haim770

+0

@ haim770 Ridondante, sì, ma non problematico o dannoso. – Servy

risposta

2

imho, vista la query SQL, questo non è (solo) un problema di prestazioni relativo all'EF, ma un problema di prestazioni del server SQL.

Si dovrebbe considera i seguenti:

  • come ID non è un PK: creare un indice su di esso;
  • utilizzare EXEC sp_updatestats per aggiornare le statistiche e aiutare il server db a produrre piani di esecuzione migliori.

btw: quanto dura la query 1 in SSMS?

2

Ho trovato la soluzione.

Ho abbandonato tutti i piani di esecuzione utilizzando sp_recompile e ora tutto funziona correttamente.

Thx per il vostro aiuto.

P.

+0

e la query è ancora diversa? quello con parametro è ancora più lento poiché EF produce stranamente sql – Thorarins

+0

le query sono sempre le stesse. ma entrambi richiedono lo stesso tempo –