偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何提升LINQ的查詢性能(上)

開發(fā) 后端
我們本篇文章不對(duì)談了Linq系列技術(shù)是否好,是否改用,而是告訴那些將會(huì)或者已經(jīng)使用了Linq技術(shù)的朋友,如何來(lái)提升Linq2Sql查詢的性能。

自從Linq提出了之后,讓很多的開發(fā)人員一陣的狂喜,編寫代碼似乎比以前更別的方便了,特別是隨著Linq2Sql等推出來(lái)之后,開發(fā)人員感到了似乎手中有了強(qiáng)大的武器。同時(shí),Linq2Sql帶來(lái)的問題不斷的出現(xiàn),特別實(shí)在性能上面,這是讓很多的多性能有著高要求的應(yīng)用要放棄Linq2Sql系列技術(shù)的原因,并且很多回到了以前的ADO.NET技術(shù),追求完全的控制。

 

系列文章:

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

這里和大家分享一些知識(shí)。我們本篇文章不對(duì)談了Linq系列技術(shù)是否好,是否改用,而是告訴那些將會(huì)或者已經(jīng)使用了Linq技術(shù)的朋友,如何來(lái)提升Linq2Sql查詢的性能。

 

在本篇文章中,我們首先會(huì)介紹Linq2Sql查詢是如何被執(zhí)行的,然后我們介紹如何來(lái)編譯Linq查詢從而使得其性能提升。

本篇希望大家對(duì)Linq2Sql查詢,特別是Linq2Sql的使用有一定的經(jīng)驗(yàn)。

 

本篇的議題如下:

深入的查看Linq2Sql查詢的工作原理(上)

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

性能比較(下)

結(jié)果分析(下)

 

深入的查看Linq2Sql查詢的工作原理

 

首先我們來(lái)看看下面的一個(gè)簡(jiǎn)單的Linq查詢,這個(gè)查詢非常的簡(jiǎn)單,就是從一個(gè)Customer表中獲取數(shù)據(jù),這個(gè)Linq的查詢被Linq的引擎轉(zhuǎn)換為SQL語(yǔ)句,如下:

 

20120410110155.png

 

 

 

對(duì)于一個(gè)Linq查詢,首先,需要檢查它的語(yǔ)法,詞法,***產(chǎn)生SQL語(yǔ)句。這個(gè)過程可以說是非常耗時(shí)的,并且對(duì)于每個(gè)Linq查詢都要這樣做。如果我們可以將每一個(gè)Linq查詢的查詢計(jì)劃緩存的話,那么就快了。

 

其實(shí)這個(gè)原理和我們使用SQL Server一樣:把SQL Server提交到數(shù)據(jù)庫(kù),首先執(zhí)行詞法語(yǔ)法分析,然后生成查詢樹,然后再交給查詢優(yōu)化器,生成執(zhí)行計(jì)劃,然后交給執(zhí)行引擎去執(zhí)行,***又存儲(chǔ)引擎獲取數(shù)據(jù),并且生成的執(zhí)行計(jì)劃被緩存,以便重用,這樣就極大的提升了性能,更多請(qǐng)看這里。

 

在Linq技術(shù)中,提供了一種名為編譯Linq查詢的技術(shù)。在編譯的Linq查詢中,Linq生成的執(zhí)行計(jì)劃被緩存在一個(gè)靜態(tài)的類中。我們知道,靜態(tài)類是一個(gè)全局的公共資源,所以Linq查詢可以去這個(gè)靜態(tài)類中找到相應(yīng)的執(zhí)行計(jì)劃,而不是每次都去解析,如下:

 

20120410110237.png

 

從上圖中可以看到:從Linq的查詢到***的執(zhí)行解析成為SQL去執(zhí)行,需要經(jīng)歷四個(gè)步驟,如果沒有緩存Linq查詢的執(zhí)行計(jì)劃,那么其實(shí)就是有5個(gè)步驟的,如下:

 

20120410110310.png

 

 

如何編寫編譯的Linq查詢

 

既然已經(jīng)知道了編譯查詢可以提升性能,那么我們就來(lái)看看具體的如何操作。

首先就要導(dǎo)入System.Data.Linq命名空間。

然后,為了避免一上來(lái)就丟上一大堆代碼使得朋友們不舒服,我們就一點(diǎn)點(diǎn)的來(lái)進(jìn)行:

    1. 首先定義一個(gè)靜態(tài)的類:clsCompiledQuery
    2. 然后添加一個(gè)公共的靜態(tài)方法指針變量,簽名如下:

20120410110414.png

 

那么對(duì)于這個(gè)方法:

a. 這個(gè)方法的參數(shù)要首先接受一個(gè)DataContext對(duì)象

b. 這個(gè)方法可以隨后接受一個(gè)或者多個(gè)輸入?yún)?shù),現(xiàn)在在我們的例子中,我們就接受了一個(gè)string類型的輸入?yún)?shù),因?yàn)槲覀兊纳厦娴腸ustomer的查詢只是傳入了一個(gè)txtCustomer.Text的值。

c. 我們需要定義類型為IQueryable的輸出參數(shù)。

 

 

3. 定義好了方法指針的變量之后,我們就可以調(diào)用CompiledQuery類的方法Compiled,并且將DataContext與一個(gè)string作為輸入?yún)?shù),如下:

 

20120410110555.png

 

 

4. 整個(gè)方法指針的定義完整代碼如下:

20120410110637.png

5.整個(gè)靜態(tài)類的定義如下:

20120410110714.png

 

上面的準(zhǔn)備工作做好了之后,我們就開始使用??梢栽谛枰牡胤竭M(jìn)行如下的調(diào)用:

 

20120410110751.png

原文鏈接:http://www.cnblogs.com/yanyangtian/archive/2012/04/12/2443924.html

【編輯推薦】

  1. Linq to xml操作XML
  2. XML之父解讀未來(lái)互聯(lián)網(wǎng)"游戲化"的三個(gè)真諦
  3. Ajax和Web服務(wù)數(shù)據(jù)格式:XML SOAP HTML
  4. 超強(qiáng)解析XML——簡(jiǎn)單直接的來(lái)
  5. 解析PHP中的XML數(shù)據(jù)
責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2017-03-13 09:50:00

HadoopHive

2023-05-25 20:06:17

Linux游戲性能

2009-09-17 09:11:26

LINQ查詢

2011-11-30 21:59:41

ibmdwDojo

2009-09-17 09:45:36

LINQ查詢語(yǔ)句

2021-12-02 07:02:16

API性能設(shè)計(jì)

2009-09-14 18:53:27

LINQ查詢

2009-09-14 18:41:59

LINQ查詢

2009-09-16 17:33:16

LINQ TO SQL

2009-09-07 22:29:04

LINQ組合查詢

2024-09-19 08:09:37

MySQL索引數(shù)據(jù)庫(kù)

2023-12-14 12:56:00

MongoDB數(shù)據(jù)庫(kù)優(yōu)化

2019-06-11 15:25:03

JSON性能前端

2020-12-03 08:00:00

SQL數(shù)據(jù)庫(kù)MySQL

2009-09-15 10:46:04

LINQ to SQL

2009-09-16 10:38:43

LINQ查詢

2009-09-17 13:15:20

LINQ查詢

2009-09-16 10:08:06

LINQ查詢

2009-09-15 10:35:11

linq多表查詢

2023-11-14 18:04:26

SQL語(yǔ)句性能
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)