2015-11-20 41 views
4

我正在幫助提高分佈在整個代碼庫中的數百個實體框架查詢的複雜應用程序的性能。我們遇到的一個問題是,當我們運行SQL事件探查器並捕獲實體框架查詢時,發現實際上導致通過剖析器的sql語句的代碼非常耗時。我想知道是否有某種方法可以用每個實體框架語句「標記」一個唯一的標識符,這個標識符將在sql語句中出現。對於實體框架爲每個語句生成的實際sql語句添加註釋的方式。然後,我們可以在分析器跟蹤中看到註釋,然後在代碼中搜索標籤。關於我們如何去做這件事的任何想法?我猜想必須有一些方法可以攔截EF生成的sql,並在它發佈到數據庫服務器之前向它添加我們的評論。如何「標記」實體框架查詢

+2

你可以在你的選擇中加入一個常量,例如'select new {Tag =「Query 123」,...}' – juharr

+0

你可能需要將該常量連接到某個東西,以確保它作爲參數傳遞。 – juharr

+0

如果選擇得到優化,我不知道類似的東西是否會在「where」子句中起作用。我很肯定「1 = 1」沒有得到優化,所以也許「WHERE'Tag1'='Tag1'」可以工作。 –

回答

1

我個人使用代碼分析器而不是SQL分析器(我更喜歡JetBrain的dotTrace)。實體框架有時會根據要執行的操作生成多個查詢,因此,將每個查詢標記爲特定操作並不會很簡單,因爲它不一定會找到每個查詢的方式。

根據我的經驗,EF性能問題通常是由於在執行完整表格加載和水化大量對象的錯誤位置上進行的linq查詢操作。代碼分析器還將允許您專注於代碼中的哪個位置來解決這些問題,而不是查找創建有問題的SQL語句的操作。

+0

我第二個這個建議。在最近完成了這個確切的任務之後,我們嘗試了一些不同的分析選項,這些選項幫助我們找到需要很長時間的EF查詢;作爲@MutantNinja解釋大部分是由於檢索表上的所有行/實體並理解實體上的過濾而不是數據庫(優化您的Linq查詢的SQL轉換)。 – jcruz

+0

Intellitrace(VS 2013 Ultimate; VS 2015 Pro&Ultimate)也是一個有用的工具。 –