HQL優化


HQL優化是Hibernate程序性能優化的一個方面,HQL和SQL的語法非常類似。HQL是基於SQL的,只是增加了面向對象的封裝。如果拋開HQL同Hibernate本身一些緩存機制的關聯,HQL的優化技巧同SQL的優化技巧一樣。在編寫HQL是,需要注意以下幾個原則:

     一、避免or操作的不當。如果where子句中有多個條件,並且其中某個條件沒有索引,使用or將導致全表掃描。假定在HOUSE表中TITLE有索引,PRICE沒有索引,執行以下HQL語句:

  from House where title='出租一居室' or price < 1500

當price比較時,會引起全表掃描。

  二、避免使用not。如果where條件的子句包含not關鍵字,那么執行時該字段的索引失效。這些語句需要分成不同情況區別對待,如查詢租金不多於1800元的租房信息的HQL語句:

  from House as h where not (h.price>1800)

對於這種不大於、不小於的條件,建議使用比較運算符代替not,如下不大於就是小於等於。例如:

  from House as h where h.price <= 1800

  三、避免like的特殊形式。如果like以一個"%"或"_"開始即前模糊,則該字段的索引不起作用。但是非常遺憾的是,對於這種問題並沒有額外的解決方法,只能通過改變索引字段的形式變相的解決。

  四、避免having子句。應盡可能的在where子句而不是having子句中指定條件。having是在檢索出所有記錄后才對結果集進行過濾,這個處理需要一定的開銷,而where子句限制記錄的數目,能減少這方面的開銷。

  五、避免使用distinct。指定distinct會導致在結果中刪除重復的行。這會對處理時間造成一定的影響,因此在不要求或允許冗余時,應避免使用distinct。

  六、索引在以下情況下失效,應注意使用。

  (1)只要對字段使用函數,該字段的索引不起作用,如substring(aa,1,2)='xxx'

  (2)只要對字段進行計算,該字段的索引不起作用,如price+10


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM