مقدمة
هذا المقال جزء من سلسلة لشرح ال SQL Server Execution Plan , اذا كانت هذه اول زيارة لك لهذه السلسلة يمكنك البدء من الرابط التالي مقدمة عن خطوات تنفيذ ال Query داخل ال Sql Server ؟
في هذا المقال سوف نتناول بعض العمليات التي تتم داخل ال Execution Plan في الاستعلامات على Joins
ملاحظة جميع الامثلة تعمل على قاعدة بيانات AdventureWorks
عملية ال Join
هي جلب بيانات من جدولين مختلفين فيقوم ال SQL Server بدمج البيانات في Result Set واحدةمثال الاستعلام التالي لجلب رقم المنتج و الكمية المباعة منه
ولكي تتم عملية ال JOIN يقوم ال SQL Server بجلب البيانات المطلوبة لطرف من ال Join ثم يقوم بجلب البيانات للطرف الاخر ثم يقوم بدمجها باحد ال Operators التاليةSELECT ProductNumber , OrderQtyFROM Sales.SalesOrderDetailJOIN Production.Product ON Sales.SalesOrderDetail.ProductID = Production.Product.ProductID
- Hash Match
- Nested Loops
- Merge Join
Hash Match
يقوم ال SQL Server باختيار هذا النوع من ال JOINS عندما يكون حجم طرفين البيانات التي يتم عمل ال Join بينهم كبير.
ولفهم آلية العمل في هذه العملية لابد من فهم ما هو مصطلح ال Hashing
ال Hashing باختصار هو تحويل حجم كبير من البيانات الى Text صغيرة لا يمكن تحويل اي شيء اليها الا البيانات الاصلية
ولتوضيح اكثر اليك المثال التالي نتخيل مثلا ان لدينا بيانا عبارة عن Text بالشكل التالي
"انا اسمي محمد جلال" وتريد ان تحوله ل Hash فتقوم بتشغيل اي Hash Function لتحول ال Text الى الشكل التالي XDAS
المفترض انه اذا استخدمت نفس ال Function التي قمت بعمل ال Hashing بها على اي Text في الوجود لا ينتج ال Hash XDAS الا مع نفس النص الاصلي
اذا ما الاستفادة من ذلك؟ الاستفادة مثلا انه ممكن تخزين قيم ال Hash لانها تكون قيم صغيرة وعند عملية البحث تحول النص المراد البحث عنه الى Hash وتبحث داخل ال Hash Values مما يؤدي الى سرعة كبيرة في عملية البحث
نعود الى ال Hash Join
الفكرة انه يقوم ال SQL Server بعمل Hash لبيانات الطرف الاصغر حجما من طرفي ال JOIN ويضعها في HASH Table
ثم يقوم بعمل LOOP على الطرف الاكبر حجما ويبحث عن المطابق له لكل صف من ال Hash Table
ولكن يجب ملاحظة ان الHash Table يتم انشاءه داخل ال TEMPDB مما يؤدي الى الكتابة والقراءة منها لتنفيذ الاستعلام
فعندما نرى ان ال Execution Plan قامت باستخدام Hash Join اذا هذه اشارة الى ان الاستعلام قد يحتاج الى تعديل لتحسين ادائه
Nested Loops
في هذا النوع من ال JOINS يقوم ال SQL Server بعمل LOOP على طرف ال Join ذو الحجم الاكبر "Outer Set" ويقوم بجلب البيانات المقابلة له في طرف ال Join الاخر "Inner Set"
وفي اغلب الاحيان يكون وجود هذه العملية شيء ايجابي خصوصا اذا كان حجم البيانات غير كبير
Merge Join
في هذا النوع يعتمد ال SQL Server على ان طرفي ال Join مرتبين مسبقا بنفس الترتيب وما يقوم به هو مجرد دمج البيانات المرتبة مما يجعل هذه العملية من افضل عمليات ال JOIN اذا كانت البيانات مرتبة مسبقا في ال Indexes
ولكن اذا قام ال Sql Server بعمل عملية Sort خصيصا لعمل ال Merge Join فهنا قد قام بعملية اضافية فقط لتحقيق ال Join ولابد من فحص سبب وجودها وامكانية استبدال عملية ال Join مثلا بال Nested Loops
-------------------------------
مقالات سابقة
- مقدمة عن خطوات تنفيذ ال Query داخل ال Sql Server ؟
- نظرة بتعمق في ال Sql Server Execution Plan cache
- مقدمة عن ال Execution Plan
- SQL Server Index
- Index Scan and Index Seek
مراجع
تم بحمد الله :)
ليست هناك تعليقات:
إرسال تعليق