Dot-Net

EF 4.3.1 和 EF 5.0 DbSet.Local 比實際的數據庫查詢慢

  • August 31, 2012

我有一個包含大約 16,500 個城市的表的數據庫,以及該數據庫的 EF 數據模型(數據庫優先)。我使用程式碼將它們預載入到記憶體中:

Db.Cities.Load()

…然後在使用它們時,我嘗試了以下每個查詢:

Dim cities() As String = Db.Cities.Select(Function(c) c.CityName).ToArray

Dim cities() As String = Db.Cities.Local.Select(Function(c) c.CityName).ToArray

第一個查詢很快(約 10 毫秒),但第二個查詢第一次執行大約需要 2.3 秒(儘管在此之後呼叫它比第一個查詢快)。

這沒有任何意義,因為 SQL Server Profiler 會驗證第一個查詢是否正在訪問另一台電腦上的數據庫,但第二個不是!

我試過關閉Db.Configuration.AutoDetectChangesEnabled,我試過預先生成視圖。

我該怎麼做才能.Local更快?(並非所有執行此應用程序的客戶端都將在快速 LAN 上。)

為什麼不簡單地從第一個查詢中保存字元串列表並使用它。

List<string> cities = db.Cities.Select( x=>x.CityName).ToList();

由於 Select 可能會執行一些一致性檢查,因此本地可能會更慢。

我使用Resharper的便捷功能走過了該Local物業的源頭。如果您正在執行的只是以上三行,您將首先看到一個可能不是您的問題的呼叫。但是隨後 EF 為它創建了一個新的 ObservableCollection並逐項填充它。在第一次通話時,其中任何一個都可能代價高昂。DetectChanges``Local

直接針對 EF 的查詢DbSet將路由到我確定直接訪問內部本地記憶體的 EF 數據庫提供程序。

引用自:https://stackoverflow.com/questions/12223291