我專注於這個問題「報告類型的」查詢(計數,平均等即那些不返回域模型本身),我只是想知道如果使用HQL有任何固有的性能優勢,因爲它可能能夠利用二級緩存。或者甚至更好 - 緩存整個查詢。不HQL有超過SQL的集團通過什麼adavantages查詢
明顯隱含的好處是,NHibernate的知道列名,因爲它已經知道了那個模型映射。
我應該知道的其他任何好處?
[我使用NHibernate的,但我認爲在這種情況下有什麼適用於Hibernate會同樣適用於NHibernate的]
我專注於這個問題「報告類型的」查詢(計數,平均等即那些不返回域模型本身),我只是想知道如果使用HQL有任何固有的性能優勢,因爲它可能能夠利用二級緩存。或者甚至更好 - 緩存整個查詢。不HQL有超過SQL的集團通過什麼adavantages查詢
明顯隱含的好處是,NHibernate的知道列名,因爲它已經知道了那個模型映射。
我應該知道的其他任何好處?
[我使用NHibernate的,但我認爲在這種情況下有什麼適用於Hibernate會同樣適用於NHibernate的]
HQL是一種對象查詢語言。 SQL是一種關係查詢語言。
沒有優勢。 HQL不會超越直接數據庫查詢來執行數據聚合和計算。 的類似結果:
Select count(*), dept from employees group by dept
總是會在DB執行得更快,然後在HQL。注意我說總是,因爲採取'取決於你的情況'的思路是不合時宜的。如果它與數據和數據聚合有關;在SQL中執行。
在第二級高速緩存中的對象只由檢索到的ID,所以Hibernate總是運行查詢,以獲得ID的列表,然後要麼從第二級緩存的或與另一查詢讀那些對象。另一方面,Hibernate可以在某些情況下緩存查詢並避免數據庫調用完全失敗。但是,您必須考慮對查詢中涉及的任何表進行更改會使其無效,因此您可能不會經常打開緩存。請參閱here關於查詢緩存如何工作的說明。
所以您查詢的成本是0,如果查詢緩存,或約等於在做直接的SQL查詢。根據數據更改的頻率,您可以通過啓用查詢緩存來節省很多,否則您可能不會保存任何內容。
如果你有疑問的高容量和可以容忍陳舊的結果,我會說這是好了很多使用另一個緩存查詢結果,只有到期每隔x分鐘。
我能想到的唯一好處是,ORM查詢緩存通常在(準備)語句級別的,所以如果你做同樣的查詢很多次機會是要重複使用一個事先準備好的聲明。
不過既然你報告查詢具體要求和性能,我想不出任何實際優勢(我掩飾的事實,你還有其他優點,如數據訪問的一致性,ORM查詢VS SQL(大多數情況下用HQL編寫查詢會更容易),數據類型轉換等)
感謝您的洞察力。現在,你想嘗試回答實際問題。 – berko 2009-01-09 00:00:40
對於報告,您可能想要使用SQL。 – yfeldblum 2009-01-09 00:02:08