فى البداية يعنى ايه database ؟ 

قاعدة البيانات هي مجموعة من المعلومات أو البيانات المخزّنة بصيغة إلكترونية أو في نظام كمبيوتر.  

عادةً ما تكون قاعدة البيانات تحت تحكم نظام إدارة قاعدة بيانات (DBMS).  وهو المسئول عن تخزين وارجاع البيانات 

أنواع قواعد البيانات 

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

  • قواعد البيانات الارتباطية  Relational DB  وده النوع اللى هنتكلم عنه 

وفيها يتم تنظيم العناصر على هيئة مجموعة من الجداول التي تتضمن أعمدةً وصفوفًا. كل جدول بيمثل وحدة من تلك البيانات مثال ال product  ده جدول و ال category ده جدول وبينهم علاقة ان لكل product  category  

او لكل category  مجموعة من ال products  او لكل Product  مجموعة من ال categories  ده بيرجع لتوصيف العلاقة اللى بتخدم ال business  

وفيه انواع تانيه زي  

  • Object-oriented databases  
  • Distributed databases  
  • Data warehouses  
  • NoSQL databases  
  • Graph databases  
  • Cloud databases  
  • Multimodel database  
  • Document/JSON database  
  • Self-driving databases  

لمفاهيم 

قواعد البيانات  Relational DB   هى الاكثر شيوعا واستخداما لسهولة توصيف العلاقات بين عناصر النظام فى المقال ده هنحاول نحط خطوط رئيسية نفتح بيها مواضيع بس والباقي عليك ان شاء 

 

كيفية استرجاع البيانات 

خلينا نفترض كده لو مفيش  DBMS  وانت اللى هاتنفذ الداتا بيز   

هنفترض ان احنا عندنا هنعمل system  لبيع منتجات فهناخد جزء بسيط نحاول نشرح عليه فهنقول عندنا تصنيفات categories  و المنتجات products 

ال Indexes 

هنفترض ان احنا وصلنا لحل  هنخزن data كل جزء  ف ملف text  هيكون عندنا ملف لل products  وملف ل categories   وكل مايجيلى اضافة اروح ازود فى الملف ده ولما يجيلى تعديل اروح ادور وبعدين اعدل ولما اجى امسح ادور و بعدين اعدل حلو جدا طيب الداتا بقت كتير جدا ف عملية اني ادور وبعدين اعدل دي بقت صعبة طيب احلها ازاى ؟؟؟ 

طيب انا هرتب الداتا فى الملف واقسمهم ملفات صغيرة وكل مرة عايز اجيب او اعدل داتا اروح في ملف عارف كل ملف شايل data  اللى انا محتاجها فى انهي ملف بس ثانية واحدة هو انا هقسمهم اذاي اممممم انا كل مرة بكون محتاج data  فى الغالب هكون محتاجها بدلالة id  يبقى هقسم  وارتب الداتا با id  وبكده اقدر اروح على الفايل اللى انا محتاجه وفى الغالب هى دي الفكرة اللى قايم بيها ال clustered index 

Clustered index  

  • هو Index  لازاي data  بيتم ترتيبها وتخزينها فعليا على disk  عشان كده هو دايما واحد لان data مش هاينفع تتخزن غير بشكل واحد  
  • وبنقدر نمثله با الشكل اللى جاي ده Btree 
  • ال root  بتكون شايله انا عندي داتا من 1-100 ف  ال intermediate level  الاولى ومن 101-200 فى الثانية ومن 201-300  فى الثالثة  
  • ولما نروح على  intermediate level  هنفترض الاولي اقدر ادور على العنصر اللى ال Id  بتاعه مابين 1-100  


طيب هل انا كل مرة محتاج اجيب data  باستخدام ال id  او اي حاجة انا قررت انها حاجة فريدة مش بتتكرر نهائي و عمرها ماهتكون فاضية طبعا لا عشان كده يظهر مفهوم non-clustered index  

Non-clustered index 

هو index  لما احب اوصل ل data  باستخدام اي حاجة غير ال clustered index 
ببساطة هو انا هعمل pointers  مترتبة باستخدام ال columns  اللى بدور بدلالتها كتير وارتبها هي كمان عشان لما اجي ادور فيها  

كده حاولنا نبسط المفاهيم الاساسية لان احنا نرجع ال data  من table  واحد طيب لما احب اجيب data  من اكتر من table  ايه اللى هيحصل  

ال database engine  هيحاول يستخدم الاحصائيات اللى عنده و ال data  فانه يطلع خريطة يمشي اذاي عشان يقدر يجيب data  وعمليات بيعملها عشان يدمج data  من اكتر من ملف والعملية دي اسمها execution plan  
والعملية دي مكلفة على مستوي ال resources /processor/memory   عشان كده لما العملية دي بتكون cached  بيكون استرجاع الداتا سريع  

ومن المهم كمطور برمجيات انك تشوف العملية دي بتم ازاى وتحاول تشوف ايه اللى ممكن يتحسن جواها وكمان فى execution plan  هتلاقى ال DBMS  بيطلع لك ترشيحات ل Index  تعملها مش لازم دايما تاخد بنصيحته بس لازم تبقى فاهم ليه

 ده شكل ال Execution plan  وبيتم قرايتها من فوق لتحت  ومن اليمين لل شمال وبتقدر تجيبها من ال sql server management studio  

ال execution plan 

عمليات الوصول للداتا 

Clustered index scan  

ان DBMS  دور فى كل ال  clustered index  

Table scan  

Clustered index seeks 

Index scan 

Index seek 

2- عمليات دمج اكتر من table لتشكيل النتيجة النهائية 


Nested loops join 
Merge join 
Hash match 
ولما نبص على ال Execution plan  بنحاول نخلي معظم العمليات اللى فيها العمليات الاسرع زي seeks  لان تدور في جزء من ال index  احسن من انك تدور فى indexكله  

او ان انا استخدم index  احسن من ان انا مستخدموش اطلاقا  

طيب هو انا اللى بحدد استخدم index  ولا لا فى الحقيقة لا احنا بنساعد ال DBMS  بان احنا بنحط ال indexes اللى متوقعين ان احنا بنجيبdata  بدلالتها بس DBMS  هو اللى بيقرر يستخدمها ولا لا بناء على الاحصائيات والمعلومات اللى عنده  

 

معايير اختيار ال index 

ال primary key  بطبيعتها هى ال clustered index 
اي foreign key لانه بيستخدم فى ربط ال tables  وهينفع فى عملية استرجاع ال data  و ال merge 
ال columns  اللى بتكون فى ال where  بشكل كبير بس خد بالك لازم يكون الداتا اللى فيها مش بتتكرر او بتتكرر بشكل قليل نفتكر ليه عشان هى لو بتتكر بشكل كبير مش هيبقى فيه معنى لل Index  ده وكده كده ال DBMS  هيقرر انه مايستخدموش طب  
لو بتستخدم function  ف ال where  محتاج تعمل column  باستخدام ال function دي وتعمل عليه index  ولما تيجي تدور ب function هيكون فيه index  يدور فيه 

 

لو بتستخدم index  على two columns   الترتيب بتاعهم بيفرق  
نصائح عامة  

طيب لو ال Index  ده حاجة حلوة وبتخلى استراجع ال data  اسرع ما اخلي كل ال columns  عليها index   ده هايعرضنا  لحاجة اسمها over index  ذي ما  ال index  ليه مزايا كتير ليه عيوب ؟ وهي انه محتاج بتعدل فى كل عمليه insert  او update   للسبب ده هنعمل Index  بس على ال columns  بناء على الاسباب اللى فوق وهنشوف ب queries  بعد كده لما ال system   يكون شغال فعليا هل محتاج اضيف index  او امسح index 

ممكن تستخدم chatgpt  فى انه يقدم لك queries  بديلة وتشوف ال execution plan  بتاعتها وتبص على اول عنصر فيها بيكون شايل التكاليف للعمليه دي استخدم قد ايه من الresources  والاقل طبعا الاحسن 

ماتستخدمش GUID  ك Clustered Index  ليه ؟ عشان بيكون عشوائى وكل مرة بنضيف data  بتحتاج يعيد ترتيب ال Index تاني 

الادوات 

هنا بعض الادوات اللى هاتساعدك تشوف اداء ال system  و تعرف محتاج تاخد اي جراء ولا لا وكمان محتاج تشوف هل ال DMBS  بيستخدم ال indexes  بتاعتك ولا لا  

Queries   

مجموعة queries  جاهزة بتدور جو المعلومات اللى ال system بتاعك مستخدمها وبناء عليه تعرف هاتشيل ولا تزود index  هتلاقيها فى الرابط اللى تحت وموجود فيه :  

Finding Connection to Your Database 
Count of Connections by Login Name/Process (i.e. how many connections does an app have open) 
Finding statements running in the database right now (including if a statement is blocked by another) 
Finding the most expensive statements in your database 
Looking for Missing Indexes 

الرابط:  

 https://drive.google.com/file/d/1uk8KjIUL5eZXEobc-kxJpxM7mwBo01sr/view?usp=sharing   

Tracing Tools  

SQL Profiler  

ودي tool  مهمة جدا وفى الغالب بقدر استخدمها بشكل كبير فى ال Dev  وبقدر اشوف ايه ال queries الل بتم فى الوقت الحالي على database  وبقدر اخدها واشوف ال  execution plan واحسن فيها 

 

SQL Server Extended events 

ودي بتعمل نفس اللى بيعمله ال SQL profiler    بس ف الغالب بتكون على production environment   وبتديك حاجات زيادة للتقريب زي كده ما تشغل مسجل وبعد كده تيجي تشوف ايه اللى فيه  

الادوات دي بتحتاج permission  وفي الغالب مش هاتكون معاك على production  للسبب ده هاتطلب من ال DB admin  انه يعملك view  تقدر تشوف بيه المعلومات دي  

 

 تصحيح بعض المفاهيم خاطئة  

ال stored procedure  اسرع من ال ORM 

فى الحقيقة المعلومة دي خطا.  ليه؟  السؤال هو ليه ال stored procedure سريعة ؟ 
الجواب عشان ال execution plan  بتكون cached  بعد اول استخدام واحنا قلنا فى بداية المقال انها عملية مكلفة وده سبب سرعتها وال ORM  بيطلع حاجة اسمها  parameterized queries  وهي برده ب cache  ال execution plan   ف مفيش فرق بينهم 

 

ال view  بتحسن الاداء  

الاجابة  لا لان كل مرة بيروح ينفذ ال execution plan  من الاول  

بعض المشكلات المنتشرة وممكن ماتخدش بالك منها  

N+1 Query Issue 

لازم ناخد بالنا واحنا بنستخدم ال lazy load  ف EF  لان لو انت بتحتاج داتا من حاجة lazy loaded  جوة loop  هيعمل لكل عنصر جوة ال loop query  على ال database 

في النهاية احنا ادينا فكرة عامة لمفاهيم مهمة الخطوة الجاية عليك تدور وتبحث عنها وتستخدمها    

 #Baladtechtalks #Baladiat

  

المصادر 

https://www.oracle.com/ca-en/database/what-is-database/  
https://learn.microsoft.com/en-us/sql/relational-databases/sql-server-index-design-guide?view=sql-server-ver16  
https://levelup.gitconnected.com/the-hidden-performance-killer-in-ef-core-understanding-and-avoiding-the-n-1-query-issue-ce105c6a14e9 

 

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *