2015-05-18 13 views
5

Tôi đang sử dụng EntityFramework để chọn dữ liệu từ cơ sở dữ liệu mssql của tôi. Truy vấn của tôi trông giống như sau:EntityFramework 6.1.1 với vấn đề hiệu suất LINQ

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

Truy vấn này mất khoảng 10 giây.

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

Truy vấn này mất chưa đến 1 giây.

Tôi vừa phát hiện ra rằng EntityFramework tạo hai truy vấn khác nhau.

Query 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) 

Query 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 

Có cách nào để tăng tốc độ đầu tiên hoặc một cách khác để làm điều đó?

+0

Bạn có thể hiển thị các truy vấn được tạo cho mỗi người không? Ngoài ra, tại sao bạn không truy vấn trực tiếp 'context'? Tại sao sử dụng 'AsQueryable()'? –

+5

'AsQueryable()' là dự phòng trong cả hai trường hợp – haim770

+0

@ haim770 Dự phòng, có, nhưng không có vấn đề hoặc có hại. – Servy

Trả lời

2

imho, nhìn thấy các truy vấn sql, đây không phải là (chỉ) một vấn đề hiệu suất liên quan đến EF, mà là một vấn đề hiệu suất máy chủ SQL.

Bạn nên xem xét như sau:

  • như Id không phải là một PK: tạo một chỉ mục trên nó;
  • sử dụng EXEC sp_updatestats để cập nhật thống kê và giúp máy chủ db tạo ra các kế hoạch thực hiện tốt hơn.

btw: Mất bao lâu để truy vấn 1 trong SSMS?

2

Tôi đã tìm thấy giải pháp.

Tôi đã xóa tất cả các kế hoạch thực hiện bằng sp_recompile và bây giờ tất cả đều hoạt động tốt.

Thx để được trợ giúp của bạn.

P.

+0

và truy vấn vẫn còn khác nhau? một với tham số vẫn còn chậm hơn kể từ khi EF tạo ra sql – Thorarins

+0

các truy vấn vẫn giống nhau. nhưng cả hai đều mất cùng một lượng thời gian –

Các vấn đề liên quan