2016/03/24

Table Joins in SQL Server Execution Plan

مقدمة

هذا المقال جزء من سلسلة لشرح ال SQL Server Execution Plan , اذا كانت هذه اول زيارة لك لهذه السلسلة يمكنك البدء من الرابط التالي مقدمة عن خطوات تنفيذ ال Query داخل ال Sql Server ؟

في هذا المقال سوف نتناول بعض العمليات التي تتم داخل ال Execution Plan في الاستعلامات على Joins
ملاحظة جميع الامثلة تعمل على قاعدة بيانات AdventureWorks


عملية ال Join

هي جلب بيانات من جدولين مختلفين فيقوم ال SQL Server بدمج البيانات في Result Set واحدة
مثال الاستعلام التالي لجلب رقم المنتج و الكمية المباعة منه
SELECT  ProductNumber ,   OrderQty
FROM    Sales.SalesOrderDetail
        JOIN Production.Product ON Sales.SalesOrderDetail.ProductID = Production.Product.ProductID
 ولكي تتم عملية ال JOIN يقوم ال SQL Server بجلب البيانات المطلوبة لطرف من ال Join ثم يقوم بجلب البيانات للطرف الاخر ثم يقوم بدمجها باحد ال Operators التالية

  • 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


-------------------------------


 تم بحمد الله :)



ليست هناك تعليقات:

مقدمة عن الDevOps

في هذا المقال سوف اتحدث عن مقدمة بسيطة عن ال DevOps ولماذا لابد ان تهتم فرق تطوير البرمجيات به وما هي النتائج المترتبة عن استخدام اساليبه ...