مقدمة
هذه المقالة موجهة لمطوري قواعد البيانات.
سيتم في هذه المقالة دراسة الحلول المقترحة للمسألة 3، وذلك من خلال عرض نتائج الأداء للحلول المقترحة ومن ثم مناقشة تلك النتائج، وفي الختام عرض للأفكار المقترحة.
الحلول المقترحة
إن الحلول المقترحة لحل المسألة تتمحور حول عدة أفكار متمايزة، وهو ما يوضح كيفية مقاربة المسائل من هذا النوع، ولكن هنلك طرق أخرى لحل المسألة لم يتم التطرق لها، وهو ما حاولت أن ظهره من خلال حلولي، ولكن يبقى طرق أخرى ربما تكون مفيدة لحل هذا النوع من المسائل.
عدد الحلول المقترحة هو 10 حلول (6 حلول مرسلة مع أربع حلول من قبلي) وهي (مرتبة حسب تاريخ الإرسال):
- محمد سليمان.
- ماهر الهندي1.
- أحمد غانم.
- ماهر الهندي2.
- معاوية الرفاعي.
- رضوان نصري.
- محمد الباشا1.
- محمد الباشا2.
- محمد الباشا3.
- محمد الباشا4.
دراسة الحلول
تم دراسة الحلول المقبولة على جهازين مختلفين وباستخدام قاعدتي بيانات مختلفتين.
الجهاز الأول هو جهاز عادي بمواصفات متوسطة، أما الجهاز الثاني فهو مخدم بمواصفات جيدة.
قاعدة البيانات الأولى هي قاعدة بيانات متوسطة الحجم، أما قاعدة البيانات الثانية فهي قاعدة بيانات جيدة الحجم.
سيتم عرض النتائج على أربع جداول كل جدول يمثل حالة دراسة، ووفق المعايير التالية:
- الزمن الكلي الذي استغرقه تنفيذ الاستعلام بالميلي ثانية.
- زمن المعالجات CPU Time الذي استغرقه تنفيذ الاستعلام بالميلي ثانية، وقد يكون في بعض الأحيان أكبرمن الزمن الكلي وذلك نتيجة لأن خطة التنفيذ Execution Plan المستخدمة هي خطة تنفيذ تفرعية.
- عدد القراءات المنطقية Logical Reads التي تطلبها تنفيذ الاستعلام، وهي تمثل عدد القراءات من الذاكرة المخبئية Cache و لا يدخل ضمنها القراءات من الملفات الفيزيائية، هي تعد من أهم المعايير لدراسة أداء الاستعلامات، ولكنها ليست كافية لوحدها.
- عدد الكتابات Writes التي تطلبها تنفيذ الاستعلام، وهي تتضمن الكتابة على TempDB نتيجة استخدام جداول مؤقتة أو نتيجة خطة التنفيذ التي تشير إلى تخزين النتائج المؤقتة لتحسين أداء الاستعلامات.
ملاحظة:سترتب النتائج وفق معيار الزمن الكلي.
النتائج
جهاز عادي وقاعدة بيانات متوسطة الحجم
الترتيب | الحل المقترح | الزمن الكلي | زمن المعالجات | عدد القراءات المنطقية | عدد الكتابات |
1 | محمد الباشا4 | 556 | 953 | 111133 | 0 |
2 | محمد الباشا1 | 581 | 547 | 117708 | 0 |
3 | أحمد غانم | 638 | 1096 | 1335 | 0 |
4 | معاوية الرفاعي | 909 | 1486 | 1733 | 0 |
5 | ماهر الهندي2 | 948 | 1391 | 206407 | 286 |
6 | ماهر الهندي1 | 1006 | 1407 | 206405 | 286 |
7 | محمد سليمان | 1042 | 1532 | 206407 | 286 |
8 | محمد الباشا2 | 2166 | 2016 | 565536 | 0 |
9 | محمد الباشا3 | 2579 | 4736 | 100243 | 0 |
10 | رضوان نصري | 3084 | 2875 | 631101 | 489 |
جهاز عادي وقاعدة بيانات جيدة الحجم
الترتيب | الحل المقترح | الزمن الكلي | زمن المعالجات | عدد القراءات المنطقية | عدد الكتابات |
1 | محمد الباشا1 | 41647 | 39297 | 364814 | 0 |
2 | محمد الباشا4 | 125094 | 216514 | 10137245 | 0 |
3 | محمد سليمان | 185792 | 182796 | 10451418 | 0 |
4 | محمد الباشا2 | 196666 | 329985 | 36420568 | 0 |
5 | ماهر الهندي2 | 202531 | 295548 | 18343965 | 12379 |
6 | ماهر الهندي1 | 202754 | 296000 | 18345119 | 12379 |
7 | أحمد غانم | 221947 | 361985 | 63675 | 1 |
8 | معاوية الرفاعي | 344020 | 320125 | 18368203 | 12379 |
9 | محمد الباشا3 | 346345 | 629017 | 6041973 | 1 |
10 | رضوان نصري | 495054 | 478391 | 53498164 | 26754 |
جهاز جيد وقاعدة بيانات متوسطة الحجم
الترتيب | الحل المقترح | الزمن الكلي | زمن المعالجات | عدد القراءات المنطقية | عدد الكتابات |
1 | محمد الباشا1 | 400 | 140 | 11559 | 0 |
2 | محمد الباشا4 | 413 | 828 | 111269 | 0 |
3 | معاوية الرفاعي | 636 | 1175 | 1750 | 0 |
4 | محمد الباشا3 | 643 | 1450 | 100245 | 0 |
5 | أحمد غانم | 663 | 1048 | 1335 | 0 |
6 | ماهر الهندي1 | 696 | 1064 | 206122 | 293 |
7 | ماهر الهندي2 | 711 | 921 | 206122 | 293 |
8 | محمد سليمان | 775 | 985 | 206136 | 293 |
9 | محمد الباشا2 | 1501 | 1125 | 520345 | 0 |
10 | رضوان نصري | 1984 | 1799 | 585993 | 497 |
جهاز جيد وقاعدة بيانات جيدة الحجم
الترتيب | الحل المقترح | الزمن الكلي | زمن المعالجات | عدد القراءات المنطقية | عدد الكتابات |
1 | محمد الباشا1 | 21729 | 8750 | 364817 | 0 |
2 | محمد الباشا4 | 34103 | 70829 | 10137333 | 0 |
3 | محمد الباشا2 | 41803 | 83874 | 33520587 | 0 |
4 | أحمد غانم | 43723 | 78766 | 9660028 | 0 |
5 | ماهر الهندي2 | 74926 | 50938 | 10451404 | 0 |
6 | ماهر الهندي1 | 76738 | 44984 | 10451512 | 0 |
7 | محمد سليمان | 77016 | 44375 | 10451542 | 0 |
8 | معاوية الرفاعي | 77892 | 59672 | 10149961 | 0 |
9 | محمد الباشا3 | 83786 | 159154 | 6063774 | 0 |
10 | رضوان نصري | 133879 | 112312 | 50608894 | 26752 |
مناقشة الحلول والنتائج
نلاحظ من النتائج أن أداء الحلول مكلف، وهذا طبيعي لهكذا نوع من المسائل لأننا نتعامل مع حجم بيانات كبير نسبياً، والاستعلام يستهدف بيانات تفصيلية لذلك سنجد أن أداء الحلول منخفض مقارنة بحلول مسائل أخرى.
أما في ما يتعلق بأفكار الحلول فهي تنوعت حسب الفكرة العتمدة بالحل، فيمكننا أن نقوم بتصنيف الحلول كمجموعات بناءً على الفكرة التي تتبناها كالتالي:
- الحلول (محمد سليمان وماهر الهندي1 ومحمد الباشا4) تتبنى فكرة استخدام الـ APPLY من أجل حساب المجموع التراكمي، والفرق بينهما هو أن الحل (ماهر الهندي1) قام يتغليف الاستعلام ضمن اجرائية، بينما الحل (محمد الباشا4) أضاف الكلمة المفتاحية MERGE لتحديد نوع الدمج JOIN بين الجداول.
- الحلين (أحمد غانم وماهر الهندي2) يتبنيان فكرة الاستعلام المترابط Correlated Query من أجل حساب المجموع التراكمي.
- الحل (معاوية الرفاعي) يتبنى فكرة الدمج والتجميع على باقي الأعمدة من أجل حساب المجموع التراكمي.
- الحلين (رضوان نصري ومحمد الباشا2) يتبنيان فكرة الـ Recursive CTE من أجل حساب المجموع التراكمي بالاعتماد على العودية للحصول على قيمة المجموع التركمي للحركة السابقة والإضافة عليها بدلاً من حسابها بالاعتماد على جمع كل الحركات السابقة من أجل كل حركة، والفرق بينهما هو أن الحل (رضوان نصري) قام بالاعتماد على ROW_NUMBER من أجل توليد الأرقام المتسلسلة تاريخياً لكل حركة على مستوى كل حساب، والتي بالاعتماد عليها يمكن ربط الحركة الحالية بالحركة السابقة للحصول على مجموعها التراكمي والإضافة عليه، أما الحل (محمد الباشا2) قام بالاعتماد على TOP للحصول على الحركة التالية للحركة السابقة.
- الحل (محمد الباشا1) يتبنى فكرة Quirky UPDATE وذلك بإضافة عامود إلى جدول الحركات وتعديل قيمته حسب التسلسل التاريخي لكل حركة على مستوى كل حساب.
- الحل (محمد الباشا3) يتبنى فكرة استخدام جدول أرقام بدلاً من جدول الحركات الثاني وذلك للاعتماد عليه في عملية التجميع، والفكرة من ذلك هو أن حجم التخزين الذي يحتاجه جدول الأرقام منخفض مقارنة بحجم التخزين الذي تحتاجه الجدوال العادية، وبالتالي سينخفض حجم الدخل/الخرج المطلوب لتنفيذ الاستعلام.
الخاتمة
أريد أن أشكر كل من شارك في هذه المسألة، وأود أن أشير أن الهدف من هذه المقالات هو عرض للأفكار الممكنة لحل مسألة ما، ودراسة هذه الحلول ومقارنتها حتى تعم الفائدة على الجميع لأنه لا يمكن بأي حال من الأحوال أن يلم أي شخص بكل الأفكار الممكنة، وماغاب عن شخص ما يضيفه آخر حتى نرى المسألة من جميع الزوايا ونصل لحلول جيدة نتشاركها كفريق عمل، وليس كأفراد، وبالتالي فليكن معيارنا للمشاركة بالحلول هو تقديم الأفكار وليس الحصول على الحل الأفضل، فالحل الذي قد يكون الأفضل في حالة ما يمكن أن يكون غير ذلك في حالات أخرى.
اضف تعليقا
يجب logged in لكي تضيف ردا.