أي واحد لديه أداء أفضل؟
-
03-10-2019 - |
سؤال
أكتب نفس الاستعلام مع نهجين باستخدام 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 للحصول على فكرة أفضل عما تفعله.
ولكن بصراحة ، إذا كان لديك أي كمية من البيانات في قاعدة البيانات الخاصة بك ، فإن استعلام مثل ما يشبه سوف يمنحك نتائج مروعة.
أوصي بشدة بإعداد فهرسة النص الكامل في SQL Server ثم استخدام هذا:
لتسجيل freetext ويحتوي على وظائف في nhibernate.
مثال رائع آخر للاندماج مع استفسارات icriteria هو هنا:
http://xlib.wordpress.com/2009/12/04/integrating-freetext-search-in-nhibernate-detached-criteria/
بدلاً من ذلك ، يمكنك استخدام Lucene.net للقيام بفهرسة النص الكامل أيضًا.
نصائح أخرى
لا يوجد اختلاف كبير في الأداء الجوهري بين HQL والمعايير. إنها مجرد واجهات برمجة التطبيقات المختلفة للتعبير عن استعلام سيتم ترجمته في النهاية إلى SQL ، هذا كل شيء.
تعتمد المعايير (لا يقصد التورية) اختيار واجهة برمجة تطبيقات واحدة على الآخر على سياق الاستخدام. على سبيل المثال ، في حالتك الخاصة ، سأذهب مع المعايير. إن بناء استعلام من سلسلة متسلسل أمر معرض للخطأ ويجب أن تكون حريصًا جدًا على عدم أن تكون عرضة لهجمات الحقن. على الأقل تعيين propertyValue
ليكون IQuery
معامل...