2013-01-06 86 views
2

我已經歸一化的國家/地區/城市數據庫到多個表。城市擁有一個擁有外國國家的地區的外交鑰匙。實體框架和外鍵關係生成SQL的性能變慢

CITY表包括用於查找相關聯的數值IPAddress 2個的附加列。正如你能想象這個城市表中有超過400萬的記錄(代表其對應回區域,然後一個國家是世界上城市)。

CITYREGIONCOUNTRY是我與實體框架電動工具映射實體,它們有一個名稱列(即代表citynameregionnamecountryname,分別),和被索引的主鍵標識列。

比方說,我有一個表/實體,稱爲VisitorHit具有以下欄目:

id as int (primary key, identity) 
dateVisited as datetime 
FK_City as int (which has a many to one relationship to the CITY entity) 

在代碼中,我使用VisitorHit實體,如:

var specialVisitors = VisitorRepository.GetAllSpecialVisitors(); 
var distinctCountries = specialVisitors.Select(i => i.City.CityName).Distinct().ToArray(); 

現在GetAllSpecialVisitors返回的一個子集實際的訪問者(它工作得很快)。典型的子集包含大約10,000行。 Select Distinct聲明需要幾分鐘才能返回。最後,我需要按日期範圍(使用visitorhit.datevisited場),以進一步劃定distinctCountries並返回計數每個distinctCountry

我如何能加快這一操作任何想法?

+0

有外鍵列被正確索引?您是否查看了查詢的執行計劃以查看潛在的瓶頸? –

+0

雖然我在下面推薦一個答案,它也可能是有用的與'VisitorRepository.GetAllSpecialVisitors()的代碼來更新你的問題;' –

回答

2

你有沒有看SQL事件探查器查看正在爲此產生了哪些SQL。我的第一個猜想(因爲你不張貼GetAllSpecialVisitors的代碼)將是你懶加載在這種情況下,你將要產生多次調用數據庫(一個用於在specialVisitors每個實例)市行,以獲得市。在呼叫您可以渴望加載城市GetAllSpecialVisistors()

使用.Include("City").Include(v=>v.City)

例如事情是這樣的:

var result = from hit in context.VisitorHits 
      where /* predicates */ 
      .Include(h =>h.City) 

就像我說的,你需要看看SQL事件探查器中顯示你看到什麼SQL實際上被髮送到SQL Server。但是當我遇到這樣的問題時,結果是最常見的原因。

如果您嘗試寫在SSMS查詢自己和它運作良好,那麼另一種解決辦法是寫一個視圖中的一個視圖和查詢。這是別的東西,我有時完成後實體框架產生不有效地工作笨重查詢。