فى البداية يعنى ايه 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