如何提高Linq查詢的性能(上)
自從Linq提出了之後,讓很多的開發人員一陣的狂喜,編寫代碼似乎比以前更别的友善了,特别是随着Linq2Sql等推出來之後,開發人員感到了似乎手中有了強大的武器。同時,Linq2Sql帶來的問題不斷的出現,特别實在性能上面,這是讓很多的多性能有着高要求的應用要放棄Linq2Sql系列技術的原因,并且很多回到了以前的ADO.NET技術,追求完全的控制。
系列文章:
這裡和大家分享一些知識。我們本篇文章不對談了Linq系列技術是否好,是否改用,而是告訴那些将會或者已經使用了Linq技術的朋友,如何來提升Linq2Sql查詢的性能。
在本篇文章中,我們首先會介紹Linq2Sql查詢是如何被執行的,然後我們介紹如何來編譯Linq查詢進而使得其性能提升。
本篇希望大家對Linq2Sql查詢,特别是Linq2Sql的使用有一定的經驗。
本篇的議題如下:
深入的檢視Linq2Sql查詢的工作原理(上)
如何編寫編譯的Linq查詢(上)
性能比較(下)
結果分析(下)
深入的檢視Linq2Sql查詢的工作原理
首先我們來看看下面的一個簡單的Linq查詢,這個查詢非常的簡單,就是從一個Customer表中擷取資料,這個Linq的查詢被Linq的引擎轉換為SQL語句,如下:
<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=257" target="_blank"></a>
對于一個Linq查詢,首先,需要檢查它的文法,詞法,最後産生SQL語句。這個過程可以說是非常耗時的,并且對于每個Linq查詢都要這樣做。如果我們可以将每一個Linq查詢的查詢計劃緩存的話,那麼就快了。
在Linq技術中,提供了一種名為編譯Linq查詢的技術。在編譯的Linq查詢中,Linq生成的執行計劃被緩存在一個靜态的類中。我們知道,靜态類是一個全局的公共資源,是以Linq查詢可以去這個靜态類中找到相應的執行計劃,而不是每次都去解析,如下:
<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=258" target="_blank"></a>
從上圖中可以看到:從Linq的查詢到最後的執行解析成為SQL去執行,需要經曆四個步驟,如果沒有緩存Linq查詢的執行計劃,那麼其實就是有5個步驟的,如下:
<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=259" target="_blank"></a>
如何編寫編譯的Linq查詢
既然已經知道了編譯查詢可以提升性能,那麼我們就來看看具體的如何操作。
首先就要導入System.Data.Linq命名空間。
然後,為了避免一上來就丢上一大堆代碼使得朋友們不舒服,我們就一點點的來進行:
首先定義一個靜态的類:clsCompiledQuery
然後添加一個公共的靜态方法指針變量,簽名如下:
<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=260" target="_blank"></a>
那麼對于這個方法:
a. 這個方法的參數要首先接受一個DataContext對象
b. 這個方法可以随後接受一個或者多個輸入參數,現在在我們的例子中,我們就接受了一個string類型的輸入參數,因為我們的上面的customer的查詢隻是傳入了一個txtCustomer.Text的值。
c. 我們需要定義類型為IQueryable的輸出參數。
3. 定義好了方法指針的變量之後,我們就可以調用CompiledQuery類的方法Compiled,并且将DataContext與一個string作為輸入參數,如下:
<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=261" target="_blank"></a>
4. 整個方法指針的定義完整代碼如下:
<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=262" target="_blank"></a>
5.整個靜态類的定義如下:
<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=263" target="_blank"></a>
上面的準備工作做好了之後,我們就開始使用。可以在需要的地方進行如下的調用:
<a href="http://www.agilesharp.com/Services/BlogAttachment.ashx?AttachmentID=264" target="_blank"></a>
本文轉自yanyangtian51CTO部落格,原文連結:http://blog.51cto.com/yanyangtian/830552 ,如需轉載請自行聯系原作者