سؤال

ما هي الأداء الاختلافات بين HQL والمعايير والاستعلام؟هل هناك أي حالات حيث يكون المرء أسرع أو أبطأ من الآخر؟

تحرير: مددت السؤال باستخدام Queryover و LinQ.

=============================================

حسنا، لست متأكدا من الاستجابة للتمييز كإجابة لذلك سأعلم المشاركات مع معظم الأصوات.لا أعلم.هذا هو في الواقع أكثر مناقشة من سؤال.

هل كانت مفيدة؟

المحلول

خصائص الأداء بين iCriteria و HQL تختلف قليلا (لا أعرف عن Queryover) لسبب واحد بسيط.

استعلامات ICRITERIA ستحاول افتراضيا تنفيذ استراتيجيات جلب على النحو المحدد في تعيينك في تعيين الخاص بك في حين تعتبر HQL افتراضيا كل شيء كسول ويعتمد على تصريحات الانضمام الخاصة بك داخل استعلامك لتحديد ما هو جلب بفارغ الصبر أم لا.

يعتمد ICRITERIA بالإضافة إلى ذلك على تعيين المعلمة تمر بينما يسمح HQL بإضفاء أنواع المعلمات واضحة على سبيل المثال iquery.setint32 ("فوبارام"، 5)؛

ما هي الأمور حقا هو الاستحواذ من استفسارات ICRITERIA (انظر ICRITERIA.CREATECTRITIAMIA (). مجرى الإنجاز () إلخ) حيث سيتعين على محرك NH حل ICRITERIA ومحاولة إنشاء SQL الأكثر سارية.

في الجانب الآخر من الأسهل التنبؤ إذا كان استعلام HQL سيؤدي إلى نتائج متسقة وعلى هذا النحو يجعل استخدام QueryCache أسهل.

في كلتا الحالتين يتم إنشاء التكوين مرة واحدة باستخدام تعريفات إنشاء IsessionFactory ورسم الخرائط وما هي في الذاكرة، لذلك الأداء جيد.

يتم إنشاء جيل SQL الفعلي بشكل مختلف بين الاثنين وهذا هو السبب في أن أداة مساعدة ل ICRITERIA -> HQL غير موجودة.

في النهاية، أظهرتني تجربتي أن الأداء بين 2 هو نفس الإعطاء أو تناول بعض المللي ثانية.

كملاحظة جانبية، فإن التصريح قدر الإمكان في التعيين ستؤدي إلى إنشاء مزيد من الجيل المزدوج SQL بالإضافة إلى عملية Thhibernate، على سبيل المثال لخصائص السلسلة تعيين GransoDiceTagCode في .hbm.xml في .hbm.xml. قبل الذهاب إلى قاعدة البيانات.

نصائح أخرى

بقدر ما يتعلق الأمر Queryover، أتوقع أن يكون الأداء مطابقا لمعايير API، لأنه تم تصميمه كملحق لتلك API.لذلك لاستفسارات مكافئة في واجهات برمجة التطبيقية، أود أن يتم إنشاء نفس قاعدة البيانات نفسها.الفرق الوحيد الذي لاحظت فيه بين واجهات Queryover والمعايير هو أنني أجد واجهة Queryover لتكون "نظافة" وأكثر متعة للعمل معها.

في تجربتي، تلقت Api المعايير "الحب" أكثر من واجهة HQL.لقد قمت بتشغيل حالات حيث يمكنني التعبير عن استفسارات معينة مع واجهة المعايير التي لم أتمكن من العثور على طريقة مكافئة للتعبير عن واجهة HQL.

فيما يتعلق بالأداء، أجد الطريقة التي يتم فيها "سؤال الاستعلام" تأثير على الأداء من اختيار المعايير API مقابل HQL مقابل الاستعلام.أود استخدام الواجهة التي توفر لك أكثر ملاءمة طبيعية تفكيرك.

Queryover هو استبدال جيد للغاية لمعايير معظم النواحي بسبب بناء الجملة المحسن وسلامة النوع. ومع ذلك، تجدر الإشارة إلى أن معالجة تعبيرات Lambda في Queryover يمكن أن تكون مكلفة (وأعتقد أن نفس الشيء سوف تنطبق على استعلامات LinQ). لذلك أثناء تنفيذ استعلام SQL End لا يأخذ أطول من الأساليب الأخرى (ICRITERIA، HQL)، تحويل كائن الاستعلام إلى استعلام SQL المناسب يستغرق وقتا أطول.

كمثال، قمنا بتطوير تطبيق يقوم بتشغيل مئات من استفسارات Queryover ثانية (باستخدام دعم خلط ADO.NET) ووجدنا تحويل الاستعلامات إلى Icriteria تضاعفت تقريبا قدرتنا على تنفيذ الاستعلامات واستخدام وحدة المعالجة المركزية النصفية وبعد أعتقد أن النفقات العامة المشاركة في معالجة تعبير Lambda يمكن تقليلها كثيرا إذا كنت تستخدم ذاكرة التخزين المؤقت والاستعلام عند المستوى الثاني؛ ولكن لأن هذا غير مناسب للتطبيق الخاص بنا، لم أفعل هذا بنفسي.

فيما يتعلق بسؤالك الأكثر عمومية كما هو أسرع: يعتمد حقا. طريقة الإخبار المؤكدة الوحيدة للإخبار هي عن طريق تشغيل أداة التنميط (NHPROF Works Wonders للحصول على سيناريوهات مثل هذا). ولكن بشكل عام، يكون HQL هو الأقرب إلى SQL وبالتالي أكثر مرونة، مما يتيح لك نطاق أكثر قليلا لتحسين استفساراتك. ومع ذلك، بالنسبة للغالبية العظمى من استفسارات التعقيد البسيطة المتوسطة، لا يوجد اختلاف كبير بين ICRITERIA و HQL. واستفسارات ICRITIRIA أسهل بكثير من العمل مع إذا كانت استفساراتك مبنية ديناميكيا.

لم أجد أي فرق بين الاثنين.التي تقال - HQL لديها وظيفة غير متوفرة في المعايير-API.

في الغالب إنها مسألة أسلوب وتفضيل شخصي إذا كنت تستخدم السابق أو الأخير.والترجمة من استعلامك إلى SQL لا يحسب الكثير عندما يتعلق الأمر بالاستعانة.

من الأشخاص الذين يعرفون أكثر مني: http://ayende.com/blog/archive/2009/01/niberenate -queries-ndash-should-i-use-hql-or-criteria.aspx

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top