لماذا يتم إنشاء SQL ذو معلمات بواسطة NHibernate بنفس سرعة الإجراء المخزن؟

StackOverflow https://stackoverflow.com/questions/50346

  •  09-06-2019
  •  | 
  •  

سؤال

يدعي أحد زملائي في العمل أنه على الرغم من تخزين مسار التنفيذ مؤقتًا، إلا أنه لا توجد طريقة تكون بها SQL ذات المعلمات التي يتم إنشاؤها من ORM بنفس سرعة الإجراء المخزن.أي مساعدة مع هذا المطور العنيد؟

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

المحلول

سأبدأ بقراءة هذا المقال:

http://decipherinfosys.wordpress.com/2007/03/27/using-stored-procedures-vs-dynamic-sql-generated-by-orm/

وهنا اختبار السرعة بين الاثنين:

http://www.blackwasp.co.uk/SpeedTestSqlSproc.aspx

نصائح أخرى

الجولة 1 - يمكنك بدء تتبع ملف التعريف ومقارنة أوقات التنفيذ.

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

أود فقط إضافة شيئين إلى إجابة روب:

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

ثانيًا، اجعل كل شيء آخر متساويًا باستثناء استخدام الاستعلام الذي تم إنشاؤه بواسطة nHibernate واستدعاء s'proc.نأمل أن تتمكن من تنفيذ الاختبار بمجرد استبدال الموفر.

أخيرًا، عليك أن تدرك أن هناك عادةً ما يكون على المحك أكثر من مجرد الإجراءات المخزنة مقابل الإجراءات المخزنة.ORM.مع أخذ ذلك في الاعتبار، يجب أن ينظر الاختبار إلى جميع العوامل:وقت التنفيذ، واستهلاك الذاكرة، وقابلية التوسع، والقدرة على تصحيح الأخطاء، وما إلى ذلك.

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

الحجة الأفضل لاستخدام الإجراءات المخزنة هي الأمان.إذا كنت تستخدم فقط الإجراءات المخزنة، مع لا SQL الديناميكي، يمكنك تعطيل أذونات SELECT وINSERT وUPDATE وDELETE وALTER وCREATE لمستخدم قاعدة بيانات التطبيق.سيؤدي هذا إلى حمايتك من معظم حقن SQL من الدرجة الثانية، في حين أن الاستعلامات ذات المعلمات تكون فعالة فقط ضد الحقن من الدرجة الأولى.

قم بقياسه ولكن بمقياس غير دقيق، أي.شيء يمثل عمليات حقيقية في نظامك.حتى لو كانت هناك فائدة أداء صغيرة لإجراء مخزن، فستكون غير ذات أهمية مقابل التكاليف الأخرى التي يتكبدها الكود الخاص بك:في الواقع استرجاع البيانات، وتحويلها، وعرضها، وما إلى ذلك.ناهيك عن أن استخدام الإجراءات المخزنة يرقى إلى نشر المنطق الخاص بك عبر تطبيقك و قاعدة البيانات الخاصة بك مع عدم وجود تحكم كبير في الإصدار أو اختبارات الوحدة أو دعم إعادة البناء في الأخير.

قم بقياسها بنفسك.اكتب فئة اختبارية تنفذ إجراءً مخزنًا لعينة بضع مئات من المرات، وقم بتشغيل كود NHibernate بنفس المقدار من المرات.قارن بين متوسط ​​ومتوسط ​​وقت التنفيذ لكل طريقة.

ويكون الأمر بنفس السرعة إذا كان الاستعلام هو نفسه في كل مرة.يقوم Sql Server 2005 بتخزين خطط الاستعلام مؤقتًا على مستوى كل عبارة في دفعة واحدة، بغض النظر عن مصدر SQL.

قد يكون الاختلاف على المدى الطويل هو أن الإجراءات المخزنة أسهل بكثير من مرة على DBA في إدارتها وضبطها، في حين أن مئات الاستعلامات المختلفة التي يجب استخلاصها من آثار ملف التعريف هي كابوس.

لقد كانت لدي هذه الحجة عدة مرات.
دائمًا ما ينتهي بي الأمر بالحصول على dba جيد حقًا، وتشغيل proc وجزء من التعليمات البرمجية مع تشغيل ملف التعريف، والحصول على dba لإظهار أن النتائج قريبة جدًا ولا تذكر.

قيسها، قم بقياسها.

حقًا، ربما تكون أي مناقشة حول هذا الموضوع عديمة الجدوى حتى يتم قياسها.

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

ستؤدي طبقة التجريد الإضافية إلى أن تكون أبطأ من الاستدعاء النقي إلى sproc.فقط من خلال حقيقة أن لديك تخصيصات إضافية على الكومة المُدارة، وعمليات دفع إضافية وانبثاق خارج مكدس الاستدعاءات، فإن حقيقة الأمر هي أنه من الأكثر فعالية استدعاء sproc بدلاً من إنشاء ORM للاستعلام، بغض النظر عن مدى جودة أورم هو.

إن مدى البطء، حتى لو كان قابلاً للقياس، أمر قابل للنقاش.ومما يساعد في ذلك أيضًا حقيقة أن معظم ORM لديها آلية تخزين مؤقت لتجنب إجراء الاستعلام على الإطلاق.

حتى لو كان الإجراء المخزن أسرع بنسبة 10% (ربما ليس كذلك)، فقد ترغب في أن تسأل نفسك عن مدى أهميته حقًا.ما يهم حقًا في النهاية هو مدى سهولة كتابة التعليمات البرمجية لنظامك وصيانتها.إذا كنت تقوم بترميز تطبيق ويب، وتم إرجاع جميع صفحاتك خلال 0.25 ثانية، فإن الوقت الإضافي الذي يتم توفيره باستخدام الإجراءات المخزنة يكون ضئيلًا.ومع ذلك، يمكن أن يكون هناك العديد من المزايا الإضافية لاستخدام ORM مثل NHibernate، والتي سيكون من الصعب للغاية تكرارها باستخدام الإجراءات المخزنة فقط.

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