如何提高Linq查詢的效能(上)

2021-09-08 03:12:09 字數 1848 閱讀 4132

如何提高linq查詢的效能(上)

自從linq提出了之後,讓很多的開發人員一陣的狂喜,編寫**似乎比以前更別的方便了,特別是隨著linq2sql等推出來之後,開發人員感到了似乎手中有了強大的**。同時,linq2sql帶來的問題不斷的出現,特別實在效能上面,這是讓很多的多效能有著高要求的應用要放棄linq2sql系列技術的原因,並且很多回到了以前的ado.net技術,追求完全的控制。

如何提高linq查詢的效能(上)

如何提高linq查詢的效能(下)

這裡和大家分享一些知識。我們本篇文章不對談了linq系列技術是否好,是否改用,而是告訴那些將會或者已經使用了linq技術的朋友,如何來提公升linq2sql查詢的效能。

在本篇文章中,我們首先會介紹linq2sql查詢是如何被執行的,然後我們介紹如何來編譯linq查詢從而使得其效能提公升。

本篇希望大家對linq2sql查詢,特別是linq2sql的使用有一定的經驗。

本篇的議題如下:

深入的檢視linq2sql查詢的工作原理(上)

如何編寫編譯的linq查詢(上)

效能比較(下)

結果分析(下)

深入的檢視linq2sql查詢的工作原理

首先我們來看看下面的乙個簡單的linq查詢,這個查詢非常的簡單,就是從乙個customer表中獲取資料,這個linq的查詢被linq的引擎轉換為sql語句,如下:

對於乙個linq查詢,首先,需要檢查它的語法,詞法,最後產生sql語句。這個過程可以說是非常耗時的,並且對於每個linq查詢都要這樣做。如果我們可以將每乙個linq查詢的查詢計畫快取的話,那麼就快了。

其實這個原理和我們使用sql server一樣:把sql server提交到資料庫,首先執行詞法語法分析,然後生成查詢樹,然後再交給查詢優化器,生成執行計畫,然後交給執行引擎去執行,最後又儲存引擎獲取資料,並且生成的執行計畫被快取,以便重用,這樣就極大的提公升了效能,更多請看這裡。

在linq技術中,提供了一種名為編譯linq查詢的技術。在編譯的linq查詢中,linq生成的執行計畫被快取在乙個靜態的類中。我們知道,靜態類是乙個全域性的公共資源,所以linq查詢可以去這個靜態類中找到相應的執行計畫,而不是每次都去解析,如下:

從上圖中可以看到:從linq的查詢到最後的執行解析成為sql去執行,需要經歷四個步驟,如果沒有快取linq查詢的執行計畫,那麼其實就是有5個步驟的,如下:

如何編寫編譯的linq查詢

既然已經知道了編譯查詢可以提公升效能,那麼我們就來看看具體的如何操作。

首先就要匯入system.data.linq命名空間。

首先定義乙個靜態的類:clscompiledquery

然後新增乙個公共的靜態方法指標變數,簽名如下:

那麼對於這個方法:

a. 這個方法的引數要首先接受乙個datacontext物件

b. 這個方法可以隨後接受乙個或者多個輸入引數,現在在我們的例子中,我們就接受了乙個string型別的輸入引數,因為我們的上面的customer的查詢只是傳入了乙個txtcustomer.text的值。

c. 我們需要定義型別為iqueryable的輸出引數。

3. 定義好了方法指標的變數之後,我們就可以呼叫compiledquery類的方法compiled,並且將datacontext與乙個string作為輸入引數,如下:

4. 整個方法指標的定義完整**如下:

5.整個靜態類的定義如下:

上面的準備工作做好了之後,我們就開始使用。可以在需要的地方進行如下的呼叫:

如何提高Linq查詢的效能(上)

如何提高linq查詢的效能 上 自從linq提出了之後,讓很多的開發人員一陣的狂喜,編寫 似乎比以前更別的方便了,特別是隨著linq2sql等推出來之後,開發人員感到了似乎手中有了強大的 同時,linq2sql帶來的問題不斷的出現,特別實在效能上面,這是讓很多的多效能有著高要求的應用要放棄linq2...

如何提高Linq查詢的效能(上)

如何提高linq查詢的效能 上 自從linq提出了之後,讓很多的開發人員一陣的狂喜,編寫 似乎比以前更別的方便了,特別是隨著linq2sql等推出來之後,開發人員感到了似乎手中有了強大的 同時,linq2sql帶來的問題不斷的出現,特別實在效能上面,這是讓很多的多效能有著高要求的應用要放棄linq2...

如何提高MySQL Limit查詢的效能

mysql的優化是非常重要的。其他最常用也最需要優化的就是limit。mysql的limit給分頁帶來了極大的方便,但資料量一大的時候,limit的效能就急劇下降。同樣是取10條資料 select from yanxue8 visit limit 10000,10 和 select from yan...