NHibernate查詢最佳化的相關資料

來源:互聯網
上載者:User

標籤:系統   archive   hiberna   而且   不能   一點   關聯   sql語句   情況   

一.http://www.cnblogs.com/dddd218/archive/2009/09/01/1557640.html

1.立即載入(lazy=false)並不能在所有情況下都會減少SQL語句,同時還會帶來過量讀取資料的嚴重後果
  比如,在mapping檔案中為實體AEntity設定了一個關聯實體BEntity,並且將這個關聯設定為lazy=false,這樣當載入實體AEntity時(調用Get(id)),NHibernate就會自動載入實體BEntity。通過查看NHibernate產生的sql發現NHibernate產生的是2條sql,第一條sql擷取的是AEntity,第二條擷取的是BEntity,所以說在這種情況下,我的理解是,lazy=false並不會減少實際執行的sql語句,只是減少了程式員編寫查詢(sql)的數量,適當減輕了程式員的編程負擔。
  立即載入的最大好處就是關聯實體或集合由NHibernate自動載入,無需程式員手工載入。但是付出的代價則是有可能導致資料的過量讀取,加大資料庫、網路資料轉送、應用伺服器的負擔,舉例如下:
(1)多對一的關聯實體立即載入:比如當前某個操作僅需擷取AEntity而不需要擷取BEntity的詳細資料,由於立即載入,導致在載入AEntity的同時載入BEntity,如果BEntity還關聯了CEntity而且也是立即載入,那麼NHibernate同時還會載入CEntity,如果CEntity還關聯了……
(2)一對多的關聯集合立即載入:如果關聯的資料是一個集合,並且集合資料很多(比如集合中有成千上萬條資料),那麼一次性立即載入整個關聯集合資料的開銷是顯而易見的。
(3)類(class)層級的lazy=false:上面提到的兩種情況是把lazy=false設定在關聯層級上(細粒度),如果把lazy=false設定在整個class上(大粒度),那麼情況將更加糟糕,這樣當載入該類實體時會同時載入所有關聯的實體和集合。

2.所有的關聯實體和關聯集合最好都保持預設的消極式載入
  由上面的分析可知,關聯實體和集合最好保持預設的消極式載入,所以我在實際的開發中是不進行任何lazy=false設定的。如果要同時載入關聯實體或集合,最有效方法就是編寫join和 dynamic fetching join的查詢操作,這既可以減少所需執行的sql語句(join操作可以在一條語句中擷取多個關聯實體(關聯資料表)或關聯實體的properties(欄位), 這是由join這類別關係操作的本質決定的),同時按需擷取資料避免資料的過量載入。

3. 普通join與 dynamic fetching join的區別
  剛開始使用NHibernate時,以為join與 dynamic fetching join是一回事,後來才明白兩者的區別。我的理解,說得簡單一點就是,dynamic fetching join會在一條sql語句中擷取關聯實體和/或關聯集合資料,並把它(們)裝配(marshal)成完整的persistent entity。而join會在一條sql語句中可以僅擷取關聯實體的某個property或某幾個properties,而不一定是一個完整的persistent entity。具體join與 dynamic fetching join操作請參見線上文檔。

4. 盡量避免在mapping檔案中進行如下這些設定
  如:lazy="false"(立即載入), fetch="subselect"(子查詢抓取),batch-size="20"(批量抓取),fetch="join"(關聯抓取)等,因為在 mapping檔案中的設定是global設定,會對整個系統產生全域性的影響。而且有些設定對Get、Load、HQL和Criteria都產生影響,而有些設定對HQL不影響對Criteria有影響。舉個例子,當分別執行同樣功能的HQL和Criteria時,卻得到不同的查詢結果時,你或許會感到非常驚訝;當對此問題進行了一天一夜的調試和冥思苦想之後,突然發現是由於mapping檔案中的某個設定導致HQL和Criteria的差異時,你一定會氣得想把電腦給砸了,並發誓永不再在mapping中設定這些東西!

 

NHibernate查詢最佳化的相關資料

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.