2011-11-09 40 views
1

我有以下數據表的網站:實體框架哪裏查詢MVC應用程序性能問題

websiteID - int [Primary Key] 
websiteName - nvarchar(128) 
... (5 other columns) 

在URL上,我有一個網站名稱路線。在OnActionExecuting方法我運行:

public Website GetWebsiteByName(String wwwName) 
{ 
    return _zEntity.Websites.Where(w => w.websiteName == wwwName).First(); 
} 

以獲得網站數據。系統可以與一個數據庫(需求)上的許多網站一起工作,但首先出現問題。 當我用ANTS進行性能測試時,響應時間爲3秒。爲什麼需要這麼長時間?我如何跳過它?

+1

如果從SSMS運行它(假設SQL Server),查詢需要多長時間? – Dean

+0

SSMS查詢執行顯示00:00:00 – Kederf

回答

0

在websiteName列上添加索引,或者通過websiteID查詢。

沒有索引,您的查詢將會很慢。

+0

我在websiteName列上有一個索引。 – Kederf

+0

WebsiteName是索引中的第一個字段嗎?只要將它作爲索引中的許多字段之一就沒有必要的幫助。 –

+0

websiteName映射爲'nvarchar'嗎?如果EF將它視爲'varchar',sql將不會使用索引。 – jrummell

0

僅基於您提供的信息,我建議在表中爲網站名稱添加索引。這應該加快速度。但我會考慮匹配網站ID而不是網站名稱:整數匹配比比較128個字符的字符串要快。

+0

是的,我知道。但在我看來,網站名稱看起來更好的網址,ID。我可以將列長縮短爲16個字符。我想到解決方案來閱讀ApplicationStart上的所有網站將其寫入應用程序數據,但不是IEnumerable ,但爲每個網站名稱添加前綴,即「wi-」,並從應用程序讀取確切的數據(而不是從每個請求的數據庫讀取它們) 。你怎麼看? – Kederf

+0

@MariuszGarsztka院長,上面,是一個非常好的觀點。你知道與EF活動相比,實際的數據庫查詢佔用了多少時間嗎? (實際上,我不確定你是否使用了EF,是嗎?)如果你想緩存網站對象(並且我會使用web緩存而不是應用程序狀態,但這取決於你) ,並通過網站名稱訪問它們,我會使用字典對象並使用網站名稱作爲關鍵字。您可能必須使用自定義字典對象,因爲內置的字典對象不可序列化,但有幾處。 –

+0

是的,我正在使用實體框架。對數據庫的查詢很快。我試圖緩存網站對象。謝謝你的建議。你知道如何捕捉由EF創建的查詢,看看有什麼不對嗎? – Kederf