[英]Which one have better performance?
我使用NHibernate用兩種方法編寫相同的查詢:
1-通過使用HQL
如下
public long RetrieveHQLCount<T>(string propertyName, object propertyValue)
{
using (ISession session = m_SessionFactory.OpenSession())
{
long r = Convert.ToInt64(session.CreateQuery("select count(o) from " + typeof(T).Name + " as o" + " where o." + propertyName + " like '" + propertyValue + "%'").UniqueResult());
return r;
}
}
2-通過使用如下所示的ICriteria
和SetProjections
public long RetrieveCount<T>(string propertyName, object propertyValue)
{
using (ISession session = m_SessionFactory.OpenSession())
{
// Create a criteria object with the specified criteria
ICriteria criteria = session.CreateCriteria(typeof(T));
criteria.Add(Expression.InsensitiveLike(propertyName, propertyValue))
.SetProjection(Projections.Count(propertyName));
long count = Convert.ToInt64(criteria.UniqueResult());
// Set return value
return count;
}
}
現在我的問題是,哪一個性能更好? 為什么?
我認為,獲得更好的度量標准的最佳方法將如此處所述。 去下載nhProf並對其進行配置。
如果您想了解更多細節,請使用生成的sql,然后通過SQL Server Profiler運行它,以更好地了解其功能。
但老實說,如果您的數據庫中有大量數據,則執行LIKE查詢將為您帶來可怕的可怕結果。
我強烈建議您在SQL Server中設置全文本索引,然后使用此方法:
注冊自由文本並在nHibernate中包含函數。
與ICriteria查詢集成的另一個很好的例子是:
http://xlib.wordpress.com/2009/12/04/integrating-freetext-search-in-nhibernate-detached-criteria/
另外,您也可以使用Lucene.NET進行全文索引。
HQL和條件之間沒有顯着的內在性能差異。 它們只是表示查詢的不同API,最終將其轉換為SQL,僅此而已。
選擇一個API取代另一個API的標准(無雙關語)取決於使用情況。 例如,在您的特定情況下,我會選擇Criteria。 從字符串連接構建查詢非常容易出錯,因此必須非常小心,以免受到注入攻擊的影響 。 至少將propertyValue
設置為IQuery
參數...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.