Hibernate之查詢效率問題

      相信越來越多的web開發者,在持久層都採用了hibernate。都說hibernate效率高,可是當整個項目下來後發現,比
其他持久層版本慢很多,當然功能也多很多。記得當初同事測試hibernate銷率時,在100萬數據量的情況下,hibernate的效率
幾乎接近於jdbc,那麼爲什麼如今很多公司的項目運行那麼慢呢(不僅僅是hibernate),也許有些細節上的東西我們開發人員沒有注意。

   就拿hibernate來說吧,他支持hql查詢,在我們組裝sql語句時,需要注意2個問題:
   1、要查詢當然離不開數據庫,我們建表時,默認的主鍵都是索引,這裏要注意的就是關於
      建立單個索引和複合索引了。
      介紹下:單個索引就是出現索引字段作爲條件就應用 ;
              複合索引(假設是2個字段的複合索引),出現複合索引的第一個字段作爲條件就應用;
              出現複合索引的2個字段作爲條件,這應用,如果沒有出現複合索引的第一個字段則不應用;
      由此我們需要爲我們的數據庫建立索引,記住複合索引是有順序的 。
     
      影響我們建立索引的條件還有就是業務(這個很重要) ,舉個例子:如果有2個查詢條件(性別、所在部門),倘若我們要建立符合索引,
      那麼我們應該將"所在部門"字段放在前面,"性別"放在後面,主要是因爲,如果某個地方的查詢條件只有"所在部門",也可以起作用。另外要注意,如果查詢索引字段參與函數計算和like等,那麼索引也不起作用。

  2、 在我們寫查詢代碼時,儘量對應各個表的已經存在索引寫查詢條件,
      [第一個查詢條件儘量是單個索引,或者是複合索引的第一個字段]  。
  3、還有就是大家再拼裝查詢語句時,傳入的查詢條件值儘量不要直接寫在查詢語句中,而是要以參數的方式提供,
     這樣,系統多次調用統一個查詢時(比如:select * from employee where code = ?   [不要寫爲  select * from employee where code = 'aaaa']) ,
     條件值都是以參數的方式提供的,這樣,多次查詢雖然參數值不一樣,但查詢語句相同,數據庫只有第一次纔對查詢語句進行編譯,
     以後則不在編譯,所以性能會有提升。
     用參數的方式還有一個好處是:如果你不是使用
     Criteria criteria = openSession().createCriteria(**PO.class);
     criteria.add(Restrictions.like( "name",convertDBString(name) ));
     的方式,而是使用hibernate的hql的話,那麼如果參數值爲中文會有問題,用參數可以解決這個問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章