ما مقدار الأداء الذي سأخسره عن طريق زيادة عدد الرحلات إلى SQL Server؟

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

سؤال

لدي تطبيق ويب حيث يوجد خادم الويب وقاعدة بيانات SQL Server 2008 في صناديق مختلفة في نفس مزرعة الخوادم.

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


معلومات أساسية إضافية:

لدي إجراء مخزن يحتوي على عدة مئات من أسطر التعليمات البرمجية التي تحتوي على منطق القرار وبيانات التحديث وأخيرًا عبارة تحديد تقوم بإرجاع مجموعة من البيانات إلى العميل.

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

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

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

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

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

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

المحلول

بشكل عام، كقاعدة عامة يجب أن تجعل Roundtrips إلى SQL Server بحد أدنى.

"الضرب" على الخادم مكلفة للغاية، فمن الثمن في الواقع أن يربط نفس العملية إلى 3 أجزاء ثم القيام ب 1 ضرب وكل شيء آخر على الخادم.

فيما يتعلق بالصيانة، يمكنك الاتصال ب 1 PROC المخزنة من العميل، وجود هذا Proc يدعو 2 بروك.

كان لي تطبيق مع منطق البحث المتطرف، وهذا ما فعلته لتنفيذه.

بعض النتائج القياسية ... كان لدي عميل مرة أخرى قد ظهرت أن خوادم سقطت وتنهار، عندما فحصنا للمشكلة، كان العديد من المدونات الرطوبة إلى SQL Server، عندما قللنا، عدت الخوادم إلى وضعها الطبيعي.

نصائح أخرى

سوف يؤثر عليه.نستخدم خادم WeBlogic حيث يوجد كل منطق الأعمال في Appserver متصل بقاعدة بيانات DB / 2.نحن في الغالب استخدام حبوب الكيان في مشروعنا ومع معظم مكالمات خدمة العمل تجعل العديد من الرحلات إلى DB مع أي آثار جانبية مرئية.(نحن نغلق بعض الاستفسارات لتكون متعددة المائدة عند الحاجة).

يعتمد حقا على التطبيق الخاص بك.سوف تحتاج إلى القياس.

يمكن أن يقوم SQL Server SQL Server على الأجهزة الجيدة بمعالجة الآلاف من المعاملات في الثانية الواحدة.

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

يجب أن تخطئ بالتأكيد على جانب صيانة التعليمات البرمجية، ولكن المعايير للتأكد.

بالنظر إلى أن المشهد خطة الاستعلام سوف chnage، يجب أن تكون Alos مستعدة لتحديث الفهارس الخاصة بك، وربما إنشاء فهارس تغطية مختلفة.

في جوهره، يرتبط هذا السؤال ارتباطًا وثيقًا بالضيق مقابل.اقتران فضفاض.

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

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

وفي كلتا الحالتين، سأقوم بقياسه والتعديل من هناك.

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