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。
