0

我在使用實體框架6處理大量數據時遇到了麻煩。當我嘗試從數據庫獲取數據時,會發生超時錯誤。我只是包括2個額外的表到我的查詢。我的意思是我加入了3張桌子,其中一張現在是空的。 (ORDERS,ORDER_DETAILS,PEOPLE)實體框架6不能處理大數據

ORDERS表有385K條記錄,而且人有400K條記錄。我也沒有得到所有的記錄。我只爲一頁記錄了25條記錄。 (我正在使用分頁。)

這是我的示例代碼。 15秒後,它會發生超時錯誤,當我從Sql Profiler獲取tsql查詢時,它會工作,但需要37秒。

// skipCount is integer and it changes with page number. 
// pageSize is fixed integer number which is 25. 
// I also set timeout about 180 seconds 
var list = _uow.Repository<ORDERS>() 
     .Query(x => x.ACTIVE == true) 
     .Include(x => x.ORDER_DETAILS) 
     .Include(x => x.PEOPLE) 
     .OrderBy(sorting) 
     .Skip(skipCount) 
     .Take(pageSize) 
     .ToList(); 

此外,如果我使用LinqToSql查詢,工作速度非常快。

var list = (from o in _context.ORDERS 
      join od in _context.ORDER_DETAILS on o.ID equals od.DETAIL_ID 
      join p in _context.PEOPLE on o.CUSTOMER_ID equals p.ID 
      select ab) 
     .OrderBy(sorting) 
     .Skip(skipCount) 
     .Take(pageSize) 
     .ToList(); 

我該如何解決這個性能問題?或者我的錯誤在哪裏?

+0

在表格中有索引嗎?如果您確實可以檢查其健康狀況(在SQL Management Studio中,右鍵單擊數據庫,選擇Reports-> Standard Reports-> Index Physical Statistics)。也許他們分散,需要重新組織,甚至重建。如果你沒有索引,那麼你就知道下一步該做什麼。 –

+0

謝謝你提醒我,是的,我有索引,我會重新建立他們,但即使我沒有索引,不奇怪沒有得到25條記錄。我能再問一件事,爲什麼linqtosql一個工作得很好,另一個不是。 – Kadir

+1

如果沒有看到您的代碼(LINQ-to-SQL和EF),我無法回答您的問題。同時只需要25條記錄並不意味着你會迅速取消。你需要先找到它們,如果你沒有合適的索引,可能會變成非常慢的操作(你可能已經發現了)。 –

回答

0

我使用此sql代碼來重建所有索引,現在我的問題已修復。 感謝您的幫助。

USE [DATABASE_NAME] 
EXEC [sp_MSforeachtable] @command1="RAISERROR('DBCC DBREINDEX(''?'') ...',10,1) WITH NOWAIT DBCC DBREINDEX('?')"