مقدمة

هذه المقالة موجهة لمطوري قواعد البيانات.

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

 الحلول المقترحة

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

عدد الحلول المقترحة هو 10 حلول (6 حلول مرسلة مع أربع حلول من قبلي) وهي (مرتبة حسب تاريخ الإرسال):

  1. محمد سليمان.
  2. ماهر الهندي1.
  3. أحمد غانم.
  4. ماهر الهندي2.
  5. معاوية الرفاعي.
  6. رضوان نصري.
  7. محمد الباشا1.
  8. محمد الباشا2.
  9. محمد الباشا3.
  10. محمد الباشا4.

دراسة الحلول

تم دراسة الحلول المقبولة على جهازين مختلفين وباستخدام قاعدتي بيانات مختلفتين.

الجهاز الأول هو جهاز عادي بمواصفات متوسطة، أما الجهاز الثاني فهو مخدم بمواصفات جيدة.

قاعدة البيانات الأولى هي قاعدة بيانات متوسطة الحجم، أما قاعدة البيانات الثانية فهي قاعدة بيانات جيدة الحجم.

سيتم عرض النتائج على أربع جداول كل جدول يمثل حالة دراسة، ووفق المعايير التالية:

  1. الزمن الكلي الذي استغرقه تنفيذ الاستعلام بالميلي ثانية.
  2. زمن المعالجات CPU Time الذي استغرقه تنفيذ الاستعلام بالميلي ثانية، وقد يكون في بعض الأحيان أكبرمن الزمن الكلي وذلك نتيجة لأن خطة التنفيذ Execution Plan المستخدمة هي خطة تنفيذ تفرعية.
  3. عدد القراءات المنطقية Logical Reads التي تطلبها تنفيذ الاستعلام، وهي تمثل عدد القراءات من الذاكرة المخبئية Cache و لا يدخل ضمنها القراءات من الملفات الفيزيائية، هي تعد من أهم المعايير لدراسة أداء الاستعلامات، ولكنها ليست كافية لوحدها.
  4. عدد الكتابات 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) يتبنى فكرة استخدام جدول أرقام بدلاً من جدول الحركات الثاني وذلك للاعتماد عليه في عملية التجميع، والفكرة من ذلك هو أن حجم التخزين الذي يحتاجه جدول الأرقام منخفض مقارنة بحجم التخزين الذي تحتاجه الجدوال العادية، وبالتالي سينخفض حجم الدخل/الخرج المطلوب لتنفيذ الاستعلام.

الخاتمة

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