2013-10-30 161 views
3

我用EF4查詢oracle數據庫。爲什麼Entity Framework .ToList()與.Include非常慢,我該如何加快速度?

我具有2至表POINTS(具有大約100 000行)和COUNTRIES,具有countryCode作爲外鍵

每個點我有下面的方法2中的存儲庫

public List<PointsTable> GetAll() 
{ 
    using (Entities context = new Entities()) 
    { 
     List<PointsTable> theList = context.POINTS_TABLE.ToList(); 
     return theList; 
    } 
} 

public List<PointsTable> GetAllComplete() 
{ 
    using (Entities context = new Entities()) 
    { 
     List<PointsTable> theList = context.POINTS_TABLE.Include("Countries").ToList(); 
     return theList; 
    } 
} 

GetAll需要5秒,但GetAllComplete需要2分鐘!我使用AsParallel()但收益是荒謬的。

我可以加快速度嗎?或者是什麼導致速度變慢?

+0

GetAllComplete正在與國家表連接,並獲取所有點和國家,當GETALL是剛開的所有點,而引用的表。 GetAllComplete獲得更多的行。在使用大數據時,使用ToList()獲取所有項目不是一個好主意。 – wudzik

+0

但我完全失去了這裏,如果我在PL/SQL中運行這個,我在下面的兩個查詢之間沒有區別: 'select * from POINTS_TABLE' and 'select * from POINTS_TABLE a left join COUNTRY_TABLE b on B.CountryCode = A.CountryCode' – DonQi

+1

它的EF不是sql,ORM的速度比sql客戶端慢得多,如果你真的需要一次獲取200k行,請使用ado.net而不是EF。但我寧願使用LINQ並逐行獲取,或者100點包裝。 – wudzik

回答

5

的原因是,對於每個記錄您檢索這是這對20萬點的記錄將乘以很多記錄國家。

您打算在稍後查詢此數據以將其減少到您的特定需求嗎?如果沒有.ToList()他們剛剛還沒有。

更改你的資料庫方法返回IQueryable,這樣你可以限制查詢你以後需要上下行減少數據ammount的,你把memeory

private Entities _context; 

public PointsRepository(Entities context) 
{ 
    _context = context 
} 

public IQueryable<PointsTable> GetAll() 
{ 
    return context.POINTS_TABLE; 
} 

public IQueryable<PointsTable> GetAllComplete() 
{ 
    return context.POINTS_TABLE.Include("Countries"); 
} 

然後,您可以添加特定的數據你具體過濾器和ToList的結果較小。例如

using (Entities context = new Entities()) 
{ 
    var rep = new PointsRepository(context); 

    // This will change the query you send to sql to only 
    // retrieve the specific data you want and should result 
    // in much quicker execution 
    var result = rep.GetAllComplete()     // get all with includes 
        .Where(p => p.Property = "Specific") // refine the query 
        .ToList()       // retrieve the data and add to memory 
} 

希望這有助於

0

AS Parallel(),不適用於Linq to Entities,僅與Linq to Object一起工作。

用EF加載200K不是很好。

可以改善與只讀負載性能:

context.POINTS_TABLE.MergeOption = MergeOption.NoTracking; 
相關問題