簡體   English   中英

哪一個性能更好?

[英]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-通過使用如下所示的ICriteriaSetProjections

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並對其進行配置。

http://nhprof.com/

如果您想了解更多細節,請使用生成的sql,然后通過SQL Server Profiler運行它,以更好地了解其功能。

但老實說,如果您的數據庫中有大量數據,則執行LIKE查詢將為您帶來可怕的可怕結果。

我強烈建議您在SQL Server中設置全文本索引,然后使用此方法:

http://nhforge.org/blogs/nhibernate/archive/2009/03/13/registering-freetext-or-contains-functions-into-a-nhibernate-dialect.aspx

注冊自由文本並在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM