成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

LINQ查詢的效果分析

開發 后端
LINQ查詢的效果是什么呢?其實就是我們在數據操作的時的性能如何,那么我們在學習LINQ查詢的時候會有什么遇到的問題呢?那么本文就向你介紹相關的內容。

使用LINQ查詢時數據操作的性能是如何的呢?我們在進行LINQ查詢的使用時會有什么效果呢?那么這里就向你提供一點對于LINQ查詢時的數據操作的性能相關介紹。

LINQ查詢的一點體會

當我們會熟練的使用以上的查詢方法對數據庫里的內容做各種各樣的查詢以后,就應當要了解這些數據庫操作的機制,及時調整各種數據操作語句,以較高的效率運行。那么,下面我們來看看LINQ的數據庫操作,看看她都做了些什么工作。

與NHibernate來比較,LINQ在O/R Mapping的性能與可控性上確實優于NHibernate,首先,Linq默認的數據映射采用的是Attribute來實現,這是.NET特有的語法,在編譯時就已經決定了數據對象的各種屬性,而NHibernate等大多數O/RMapping工具仍然采用XML映射文件來描述數據對象的屬性,從外部文件上讀取數據對象的屬性,顯然運行時效率要有所損失。其次,在獲得數據的方式上也有所差別,LINQ中強大的SQL分析機制,可以分析出各種數據操作的SQL語句,并且進行優化,其效率的提升也是顯而易見的。

當然,作為一個O/R Mapping的工具來說,其效率一定達不到直接使用SQL語句訪問數據庫的效率,也就是我們通常所說的SqlDataReader/SqlDataAdapter訪問數據庫,但是,Linq的表現卻給了我們非常大的驚喜,我做了一個測試,使用SqlDataReader和LINQ做相同的大批量數據查詢時,落后竟然不到10%,而NHibernate的查詢效率,卻低了很多,幾乎慢了1倍。對于如此強大的數據映射功能,這樣的效率是我們可以接受的。但是很可惜的一點是,LINQ目前只能支持對SQLServer的支持(但可以支持XML、Entity等)。

在使用LINQ查詢進行數據查詢上,我們通過對LINQ生成的SQL語句進行分析,便可以優化查詢,這是非常方便的,但是,針對數據更新的效率問題,我們不得不談談LINQ的數據更新機制,一般情況下,數據更新我們會這么做:

  1. var query = from emp in dbdata.Employees   
  2. where emp.DepId=="1001" select emp;  
  3.  
  4.   Employee employee = query.First();  
  5.  
  6.   employee.EmployeeName = "李四";  
  7.  
  8.   dbdata.SubmitChanges();  

對于以上這段代碼,我們可以看出,其功能是從Employee表中取出部門代碼為1001的所有員工,然后我們取出***條數據(這里為了簡便,我們僅僅取出***條,其實可以用Where取出滿足條件的記錄),然后把名字修改成“李四”,再更新到數據庫中。這段代碼,LINQ都干了些什么呢?通過查詢從數據庫中取出若干條記錄,放在內存中,并且都標記為new(未改變)狀態,當修改了員工姓名的時候,被修改的對象被標記為Dirty(已改變),在SubmitChanges的時候,再為內存中對象狀態為Dirty的記錄自動生成SQL語句并執行,也就是說,我們要完成一次數據的更新,至少要完成一次查詢和一次更新。

LINQ查詢的一點分析:

由于采用了延時加載(Layze Load)的技術,在以上語句中實際從數據庫中取出的記錄只有1條,更新的時候也只更新這一條,因此效率仍然是非常高的,我在測試的過程中發現,從250000條數據中隨機抽取一條進行更新,實際的效率和從10條數據中隨機抽取一條進行更新幾乎沒有差別,因為比較更新狀態是在內存中進行,因此效率是比較高的。下面我們再看看實際的更新生成了什么樣的SQL語句:

  1. UPDATE [dbo].[Employee] SET [EmployeeName] =   
  2. @p4 WHERE ([EmployeeId] = @p0) AND ([DepId] = @p1) AND   
  3.  
  4. ([EmployeeName] = @p2) AND ([EmployeeSalary] = @p3)  

原來,我們只修改了EmployeeName的字段,生成的SQL語句卻也僅僅是更新了Employee字段。那么,我們再看看后面的條件,為什么會包含除了主鍵以外的其他條件呢?原來,這也是LINQ自動生成SQL語句的嚴謹所在,這是為了防止并發情況下,多個事務針對同一條記錄更新時發生錯誤,假如A事務更新了該記錄,則B事務更新會失敗。我們不禁要問,假如要更新主鍵字段怎么辦?會不會錯誤的更新到多條記錄呢?答案是肯定的,肯定會錯誤的更新到其他記錄,因此,LINQ中規定了主鍵字段是不允許更新的,如果確實要更新,那么就刪除掉該記錄,重新插入新紀錄。這么嚴謹的SQL語句,會給我們帶來一些麻煩,我們來看下面一個應用場景:

如果我們在表中設有一個字段用于計數器,使用SQL語句是這樣的:

  1. Update CountTable set CountColumn=  
  2. CountColumn+1 where CountId=@countId 

但使用LINQ生成的Sql語句卻是:

  1. UPDATE [dbo].[CountTable] SET [CountColumn] = @p2   
  2. WHERE ([CountId] = @p0) AND ([CountColumn] = @p1)  

@p2這個參數是計算好后傳入的,@p1這個參數是CountColumn原來的值。也就是說,CountColumn+1這個值不是由數據庫運算出來的,這樣一來,當并發數很高的時候,我們往往會更新失敗。我做了個測試,使用多線程模擬多用戶的情況下進行計數統計,數據庫中統計的值比使用靜態變量保存的值要小,這也就是說數據庫更新是存在失敗的情況。另外,這樣每次的更新,需要完成的操作有查找和更新兩個步驟,因此對于效率也有比較大的影響。

在這里,我們并不是要說明LINQ存在缺陷,因為這種情況可能在任何的O/R Mapping的框架下都得不到很好的解決,這里僅僅是想告訴我們,只有了解系統內部運行的情況,才能設計出效率更高,更可靠的系統。

關于使用LINQ查詢的相關內容就向你介紹到這里,希望對你了解和學習LINQ查詢有所幫助。

【編輯推薦】

  1. LINQ To SQL和ORM的理解淺析
  2. 關于LINQ模糊查詢實質的探究
  3. LINQ模糊查詢的學習心得淺析
  4. LINQ嵌套查詢實現淺析
  5. LINQ查詢方式的探尋
責任編輯:仲衡 來源: 百度空間
相關推薦

2009-09-14 10:09:26

LINQ查詢結果

2009-09-15 10:46:04

LINQ to SQL

2009-09-17 17:03:13

LINQ動態查詢

2009-09-15 14:58:26

Linq查詢本質

2009-09-16 10:48:32

LINQ查詢操作

2009-09-16 15:41:45

LINQ查詢XML文檔

2009-09-18 16:46:15

LINQ查詢句法

2009-09-17 08:47:00

Linq查詢

2009-09-14 17:03:32

LINQ模糊查詢

2009-09-14 18:41:59

LINQ查詢

2009-09-14 19:14:51

LINQ動態查詢

2009-09-15 10:35:11

linq多表查詢

2009-09-09 16:53:53

LINQ查詢語法

2009-09-10 16:28:17

LINQ查詢

2009-09-14 10:13:02

LINQ查詢操作

2009-09-08 17:27:18

LINQ to Dat

2009-09-16 10:38:43

LINQ查詢

2009-09-17 13:15:20

LINQ查詢

2009-09-16 10:08:06

LINQ查詢

2009-09-10 14:21:58

LINQ匿名類型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 最新日韩在线 | 在线一区二区国产 | 一级全黄少妇性色生活免费看 | 成人欧美一区二区三区 | 中文字幕在线第二页 | 欧美性网 | 夜夜久久 | 亚洲日韩中文字幕一区 | 国产美女免费视频 | 亚洲免费观看视频 | 日韩欧美三区 | av资源中文在线天堂 | 亚洲区一区二区 | 国产 日韩 欧美 制服 另类 | 欧美一区二区三区 | 欧美日韩国产精品一区 | 色狠狠一区 | 天天综合久久网 | 午夜在线电影网 | 中文一级片 | 婷婷福利视频导航 | 夜夜爽99久久国产综合精品女不卡 | 中文字幕日韩三级 | 亚洲欧美日韩精品久久亚洲区 | av黄色网| 最新免费视频 | 99热欧美 | 狠狠久久综合 | 最新伦理片 | 国产99在线 | 欧美 | 成人黄色电影在线播放 | 久久国产精品久久久久久 | 国产在线精品一区二区 | 夜夜爽99久久国产综合精品女不卡 | 久久久黑人 | 亚洲精品无 | 91在线精品视频 | 日韩一区二区三区视频 | 日韩精品一区二区三区在线观看 | 不卡在线视频 | av在线播放网址 |