omar-alreyati بتاريخ: 6 يونيو 2007 تقديم بلاغ مشاركة بتاريخ: 6 يونيو 2007 الموضوع الذي سوف أتطرق له هو كيفية عمل tuning لجمل الSQL لزيادة سرعة اخراج المخرجات ، لا أريد أن اطيل عليكم والآن دعونا نبدأ بالخطوات العملية والتي سوف تتركز على المثلة قدر الأمكان:-# القانون الأول : أستخدام Where لفلترة الصفوف:-يتم استخدام where لاخراج البيانات بناء على شرط معين ، واليك المثال الأتي ليتضح الأمر أكثر SELECT * FROM customers; CUSTOMER_ID FIRST_NAME LAST_NAME DOB PHONE ----------- ---------- ---------- --------- ------------ 1 John Brown 01-JAN-65 800-555-1211 2 Cynthia Green 05-FEB-68 800-555-1212 3 Steve White 16-MAR-71 800-555-1213 4 Gail Black 800-555-1214 5 Doreen Blue 20-MAY-70 هذا المثال أخرج جميع الصفوف من جدول الcustomers والآن ماذا سيحصل لو تم اضافة شرط where SELECT * FROM customers WHERE customer_id IN (1, 2); CUSTOMER_ID FIRST_NAME LAST_NAME DOB PHONE ----------- ---------- ---------- --------- ------------ 1 John Brown 01-JAN-65 800-555-1211 2 Cynthia Green 05-FEB-68 800-555-1212 الآن أنظر الى النتائج لقد تم فلترتها بناءً على الشرط whereهذا ما لدي في القانون الاول للSQL tuning اعلم انه قانون يعلمه الكل لكن أنظرني في الدرس القادم .لدي طلب بسيط جداًًًًااااااااااااااااًً وهو (الدعاء لي ولجميع مرضى المسلمين بالشفاء العاجل )لاني والله محتاج للدعااااااااااااااااااااااااااااااااااء الخالص الصادق 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
cello_2002 بتاريخ: 8 يونيو 2007 تقديم بلاغ مشاركة بتاريخ: 8 يونيو 2007 اللهم اشفي مرضانا ومرضى المسلمين جميعاً .. إنك سميع مجيب الدعاء. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ابن الجوزي بتاريخ: 9 يونيو 2007 تقديم بلاغ مشاركة بتاريخ: 9 يونيو 2007 أخي الفاضل عمرجزاك الله خيراًو أسأل الله أن يشفيك شفاءً عاجلاًو يجعل هذا المرض رفعاً لدرجتكأخوك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
omar-alreyati بتاريخ: 10 يونيو 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 10 يونيو 2007 تكملةً للموضوع السابق :[/code]الموضوع : أستعمال Table Joins أكثر من Multiple Queries: اليكم الشرح بالأمثلة .المثال الأول : يسترجع الname و product_type_id من جدول products للproduct =1المثال الثاني : يستعمل الproduct_type_id لاسترجاع ال name من جدول product_types SELECT name, product_type_id FROM products WHERE product_id = 1; NAME PRODUCT_TYPE_ID ------------------------------ --------------- Modern Science 1 SELECT name FROM product_types WHERE product_type_id = 1; NAME ---------- Book والآن ما رأيكم في دمج هذان الاستعلامين في أتعلام واحد لزيادة الفعالية للنتائج وتقليل عمليات جلب البيانات وكما يلي وباستخدام join بين جدولي products و product_types لاستخراج نفس النتيجة السابقة :- SELECT p.name, pt.name FROM products p, product_types pt WHERE p.product_type_id = pt.product_type_id AND p.product_id = 1; NAME NAME ------------------------------ ---------- Modern Science Book هذا الاستعلام ارجع نفس نتيجة الأستعلامين (الاول والثاني) وبشكل عام : حاول قدر الأمكان استعمال (ONE QUERY) أكثر من (TWO QUERY)انتهى القانون الثاني ، وسوف يكون هناك المزيد أن شاء الله اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
omar-alreyati بتاريخ: 11 يونيو 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 11 يونيو 2007 حياكم الله مجدداً أتمنى أن تكون الدروس مفيد قدر المستطاع (تذكر أني أشرح كيفية عمل tuning لجمل الSQL)القانون الثالث:- استخدام Fully Qualified للأعمدة في حالة أستعمال الJoin:-للوهلة الأولى ربما أن مصطلح Fully Qualified جديد على البعض لكن مع الأمثلة سيتضح الأمر أكثر ، اليك الأمثلة ليتضح الأمر :المثال الأول :- يستخدم جدولي products و product_types ويعطيمهما alias بالترتيب p و pt SELECT p.name, pt.name, description, price FROM products p, product_types pt WHERE p.product_type_id = pt.product_type_id AND p.product_id = 1; NAME NAME ------------------------------ ---------- DESCRIPTION PRICE -------------------------------------------------- ---------- Modern Science Book A description of modern science 19.95 أنظر الى الأعمدة description و price لم يتم أضافة alias الخاص بهما أي أن هذا الأستعلام ليس Fully Qualified (مؤهل بالكامل) لجميع الأعمدة ، ربما يسأل أحد ما فائدة وضع جميع الأعمدة في حالة Fully Qualified ، الجواب أن قاعدة البيانات سوف تهدر المزيد من الوقت لكي تبحث عن الأعمدة التي ليس معرف بها الalias لكي تعرف لمن ترجع هذا الأعمدة في الجدوال ، ربما يسأل آخر وهل هذا الوقت الى الدرجة من الأهمية ، الجواب نعم لا، هناك من الأستعلامات من يأخد وقت طويل جداً (5 دقائق مثلاً) فما بالك لو أن الاستعلام كان يحوي العديد من الجدوال والأعمدة ولم يتم استعمال Fully Qualified بشكله الصحيح أكيد أن الوقت سوف يهدر للبحث عن مطابقة الأعمدة مع الجدوال.المثال الثاني : نفس المثال السابق لكن مع أضافة الalias =p للأعمدة description و price :- SELECT p.name, pt.name, p.description, p.price FROM products p, product_types pt WHERE p.product_type_id = pt.product_type_id AND p.product_id = 1; NAME NAME ------------------------------ ---------- DESCRIPTION PRICE -------------------------------------------------- ---------- Modern Science Book A description of modern science 19.95 لاحظ أن النتائج في الأستعلامين متساوين ، ولكن الاستعلام الأول سوف يأخد وقت أكثر من الأستعلام الثاني وذلك لعدم أستعمال Fully Qualified في الاستعلام الاول زخلاصة: في حالة استخدام استعلام يحوي Join Table يجب تطبيق نظرية Fully Qualified في الأعمدة .أتمنى أن أكون قدر أوصلت الفكرة ، وأي استفسار بخصوص هذا الدرس أو الدروس السابقة أنا جاهز أن شاء الله والسلام عليكم اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
slama بتاريخ: 11 يونيو 2007 تقديم بلاغ مشاركة بتاريخ: 11 يونيو 2007 الأخ الفاضل عمر جزيت خيراوأسأل الله العظيم رب العرش العظيم أن يشفيكوأن يجعله في ميزان حسناتك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
omar-alreyati بتاريخ: 13 يونيو 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 13 يونيو 2007 القانون الرابع: أستخدام تعابير CASE بدلاً Multiple Queries (الإستفسارات المتعدّدة):-خلينا نفهم هالقانون بالأمثلة حتى يتضح الأمر أكثر.المثال الأول :- هذا المثال يستخدم Multiple Queries لحساب عدد المنتجات خلال أسعار مختلفة : (أيجاد عدد المنتجات التي سعرها أقل من 13) SELECT COUNT(*) FROM products WHERE price < 13; COUNT(*) ---------- 2 (إيجاد عدد المنتجات التي سعرها بين 13 و 15) SELECT COUNT(*) FROM products WHERE price BETWEEN 13 AND 15; COUNT(*) ---------- 5 (إيجاد المنتجات التي سعرها أكبر من 15) SELECT COUNT(*) FROM products WHERE price > 15; COUNT(*) ---------- 5 ما رأيك الآن لو قمنا بدمج هذه الأستفسارات الثلاث في أستفسار واحد بإستخدام الCASE لزيادة الPerformance : SELECT COUNT(CASE WHEN price < 13 THEN 1 ELSE null END) low, COUNT(CASE WHEN price BETWEEN 13 AND 15 THEN 1 ELSE null END) med, COUNT(CASE WHEN price > 15 THEN 1 ELSE null END) high FROM products; LOW MED HIGH ---------- ---------- ---------- 2 5 5 أنظر الى هذا الأستعلام فقد أعطى نفس نتائج الأستعلامات الثلاث السابقة وهذا يزيد من فعالية جلب البيانات من قاعدة البيانات .هذا ما لدي اليوم أتمنى أن أكون قد أوصلت الفكرة مع تمنياتي للجميع بالتوفيق والنجاح. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
molazwm بتاريخ: 13 يونيو 2007 تقديم بلاغ مشاركة بتاريخ: 13 يونيو 2007 الله ينور عليك و يزيدك كمان وكمانفعلا الموضوع مهم و المفروض كل اللي بيتعامل مع الاوراكل يقراة كويسالف شكر ليك يا اخ عمر و ربنا يشفيك و يشفي مرضي المسلمين و يعفوا عنك باذنة اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
omar-alreyati بتاريخ: 19 يونيو 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 19 يونيو 2007 القانون الخامس:- أستخدام Where بدلاً من الHavingكما هو معلوم لدى الجميع أن Where تقوم بفلترة الصفوف rows والHaving قتوم بفلترة مجموعات الصفوف Groups of Rows .ملحوظة : الHaving تقوم بفلترة مجموعات الصفوف بعد أن تقوم بتجميعها كمجموعات وهذا يأخذ بعض الوقت ، لذا يفضل استخدام Where لفلترة الصفوف قدر الأمكان .والآن دعنا نذهب للأمثلة ليتضح الأمر أكثر:-المثال الأول : يسترجع product_type_id ومعدل سعر المنتجات التي product_type_id =1 or 2 :- SELECT product_type_id, AVG(price) FROM products GROUP BY product_type_id HAVING product_type_id IN (1, 2); PRODUCT_TYPE_ID AVG(PRICE) --------------- ---------- 1 24.975 2 26.22 هذا المثال قام بتجميع الproduct_type_id كمجموعات ثم قام بفلترتها بإستخدام Having وهذا أخذ بعض الوقت ، ما رأيك بإستخراج نفس النتائج ولكن بإستخدام Where والتي تأخذ وقت أقل من الوقت المستغرق بإستخدام Having، اليك المثال :- SELECT product_type_id, AVG(price) FROM products WHERE product_type_id IN (1, 2) GROUP BY product_type_id; PRODUCT_TYPE_ID AVG(PRICE) --------------- ---------- 1 24.975 2 26.22 لاحظ ان هذا المثال قام بالفلترة بإستخدام where ثم بعدها قام بتجميعها وهذا قلل الوقت قدر الأمكان.خلاصة : حاول استخدام where لفلترة الصفوف بدلاً من having (قدر الأمكان)أنتهى الدرس والسلام عليكم. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
omar-alreyati بتاريخ: 21 يونيو 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 21 يونيو 2007 # القانون السادس : أستخدام UNION ALL بدلاً من UNION :-كما هو معلوم لدى الجميع أن الUNION ALL يستخدم أستعلامين لجلب جميع الصفوف ومن ضمنها الصفوف المكررة ، لكن الUNION لجلب الصفوف من غير تكرار ، ومن هنا يتضح لنا الUNION تقوم بحذف الصفوف المكررة وهذا يحتاج الى بعض الوقت وهذا هو مربط الفرس أن عملية الUNION تحتاج الى وقت أكثر في التنفيذ من الUNION ALL لان الUNION تحتاج بعض الوقت لحذ الصفوف المكررة.الآن دعنا نذهب الى الأمثلة لتتضح الصورة أكثر.الاستعلام الأتي يستخدم الUNION لجلب الصفوف من جدول products وجدول more_products SELECT product_id, product_type_id, name FROM products UNION SELECT prd_id, prd_type_id, name FROM more_products; PRODUCT_ID PRODUCT_TYPE_ID NAME ---------- --------------- ------------------- 1 1 Modern Science 2 1 Chemistry 3 2 Supernova 3 Supernova 4 2 Lunar Landing 4 2 Tank War 5 2 Submarine 5 2 Z Files 6 2 2412: The Return 7 3 Space Force 9 8 3 From Another Planet 9 4 Classical Music 10 4 Pop 3 11 4 Creative Yell 12 My Front Line لاحظ ان هذا الأستعلام جلب الصفوف من غير تكرار ، أما الأستعلام التالي يستخدم UNION ALL يستخدم جدولي products و more_products لجلب جميع الصفوف بما فيها المكرر :- SELECT product_id, product_type_id, name FROM products UNION ALL SELECT prd_id, prd_type_id, name FROM more_products; PRODUCT_ID PRODUCT_TYPE_ID NAME ---------- --------------- ------------------------------ 1 1 Modern Science 2 1 Chemistry 3 2 Supernova 4 2 Tank War 5 2 Z Files 6 2 2412: The Return 7 3 Space Force 9 8 3 From Another Planet 9 4 Classical Music 10 4 Pop 3 11 4 Creative Yell 12 My Front Line 1 1 Modern Science 2 1 Chemistry 3 Supernova 4 2 Lunar Landing 5 2 Submarine لاحظ ان هذا الاستعلام قام بجلب جميع الصفوف بما فيها المكرر.ملاحظة بسيطة : نحن هنا نشرح كيفية عمل tuning لجمل الSQL لذا فإذا أقتضى البرنامج جلب البيانات من غير تكرار فيجب هنا استخدام الUNION مع أنها تحتاج بعض الوقت لحذف المكرر لكن حاجة البرنامج هنا أهم .أنتهى الدرس متمنياً للجميع التوفيق والنجاح ، ولا يسعني هنا الأ أن أشكر القائمين على هذا المنتدى الرائع والذي أفتخر بأني عضو فيه وأشكر القائمين على المنتدى لثبيت الموضوع.والسلام عليكم. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
jamal_rrkk بتاريخ: 21 يونيو 2007 تقديم بلاغ مشاركة بتاريخ: 21 يونيو 2007 السلام عليكم ورحمة الله وبركاتهاخي الكريم omar-alreyatiجزاك الله كل خير علي هذا الشرح الرائع والواضح وأسأل الله العظيم أن يشفيك ويشفي جميع مرضى المسلمينوالرابط التالي يحتوي علي ملف متعلق بنفس الموضوع http://www.araboug.org/ib/index.php?showtopic=3389جزاكم الله كل خير اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
nahid بتاريخ: 21 يونيو 2007 تقديم بلاغ مشاركة بتاريخ: 21 يونيو 2007 الف شكر اخي اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
shiko_2121 بتاريخ: 22 يونيو 2007 تقديم بلاغ مشاركة بتاريخ: 22 يونيو 2007 شكرا على دروسك الاكثر من رائعة وارجو تكملة الدروس لانها مفيدة جدا وشكرا على الشرح المتميز اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
alman بتاريخ: 17 سبتمبر 2007 تقديم بلاغ مشاركة بتاريخ: 17 سبتمبر 2007 أخ عمر الله يجزيك كل خير ويعجل في شفائك ويحط من سيئاتك أنت وجميع المسلمين اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
omar-alreyati بتاريخ: 27 سبتمبر 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 27 سبتمبر 2007 القانون السابع : أستخدام EXISTS بدلاً من IN لنرى ما قصة هذا القانون : أن IN تستخدم لعمل تشيك في حالة كون القيمة موجودة في قائمة(list) ، ولكن EXISTS تختلف حيث تعمل تشيك لوجود الصفوف بينما أن IN تشيك القيم الفعلية ، لذا فإن EXISTS تعطي كفاءة أفضل من IN في حالة استخدام subqueries . واليك الأمثلة ليتضح الأمر أكثر :-اليك هذا الأستعلام الذي يستخدم IN لأسترجاع المنتجات التي تم شرائها. SELECT product_id, name FROM products WHERE product_id IN (SELECT product_id FROM purchases); PRODUCT_ID NAME ---------- ----------------------------- 1 Modern Science 2 Chemistry 3 Supernova ما رأيك لو أعدنا كتابة هذا الجملة بإستخدام EXISTS SELECT product_id, name FROM products outer WHERE EXISTS (SELECT 1 FROM purchases inner WHERE inner.product_id = outer.product_id); PRODUCT_ID NAME ---------- ----------------------------- 1 Modern Science 2 Chemistry 3 Supernova والخلاصة حاول أستخدام EXISTS بدلاً من IN في حالة استعمال subqueries .أنتهى الدرس متمنياً للجميع التوفيق والنجاح . وجزاكم الله خيراً اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
omar-alreyati بتاريخ: 27 سبتمبر 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 27 سبتمبر 2007 القانون الثامن : أستخدم EXISTS بدلاً من DISTINCT من المعلوم لدى الجميع أن DISTINCT تستخدم لحذف الصفوف المكررة ، بينما أن EXISTS تستخدم لعمل تشيك لوجود صفوف معينة ، لعل البعض يسأل ما مدى علاقة ذلك بموضوع Performance Sql Tuning ، ولفهم ذلك أقول أنه يجب أستخدام EXISTS بدلاً من DISTINCT (وذلك لأن الDISTINCT تقوم بترتيب الصفوف المسترجعة قبل أجراء حذف للصفوف المكررة وهذا يأخد بعض الوقت وهنا مربط الفرس) وليتضح الأمر أنظر الى المثال الأتي :-* هذا المثال يستخدم DISTINCT لأسترجاع المنتجات التي تم شرائها :- SELECT DISTINCT pr.product_id, pr.name FROM products pr, purchases pu WHERE pr.product_id = pu.product_id; PRODUCT_ID NAME ---------- ----------------------------- 1 Modern Science 2 Chemistry 3 Supernova ولو حاولنا أعادة المثال بإستخدام EXISTS فسوف يأخد وقت اقل من الDISTINCT SELECT product_id, name FROM products outer WHERE EXISTS (SELECT 1 FROM purchases inner WHERE inner.product_id = outer.product_id); PRODUCT_ID NAME ---------- ----------------------------- 1 Modern Science 2 Chemistry 3 Supernova الخلاصة : حاول أستخدم EXISTS بدلاً من DISTINCT لأن عملية الDISTINCT تأخد بعض الوقت (ترتيب الصوف ثم حذف الصفوف المكررة)وفي نهاية شرح هذا الموضوع أشكر كل من ساهم انجاز هذا العمل والسلام عليكم ورحمة الله وبركاته اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
king3bd بتاريخ: 14 نوفمبر 2007 تقديم بلاغ مشاركة بتاريخ: 14 نوفمبر 2007 الله يا ربي يا حبيبي يشفي الاستاز omar-alreyati... اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
PLANET بتاريخ: 1 أغسطس 2009 تقديم بلاغ مشاركة بتاريخ: 1 أغسطس 2009 الله يعطيك العافية على هذة المعلومات البسيطة في استخدامها والقوية في تاثيرها اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
زياد النشار بتاريخ: 25 أغسطس 2009 تقديم بلاغ مشاركة بتاريخ: 25 أغسطس 2009 اللهم يارب يا خالق الاكوان وخالق بحار ومثبت الجبار اشفي أخانا عمر وحباً بسيد عمر (محمد سيد البشر وصلى الله عليه وسلم ) اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ahmed_saeed_2010 بتاريخ: 3 مايو 2010 تقديم بلاغ مشاركة بتاريخ: 3 مايو 2010 (معدل) ربنا يبارك فيك ودى فكره عمل SQL TUNING على TOAD شرح فديو من quest power من هنا تم تعديل 3 مايو 2010 بواسطة ahmed_saeed_2010 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
scince بتاريخ: 5 مايو 2010 تقديم بلاغ مشاركة بتاريخ: 5 مايو 2010 اللهم أشفي مرضى المسلمينوجزاك الله خير أخي على عملك وحرصك على الدعاء للمسلمين اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
REDWAN SIFAW بتاريخ: 18 سبتمبر 2010 تقديم بلاغ مشاركة بتاريخ: 18 سبتمبر 2010 اللهم اشفيه و اشفي مرضانا ومرضى المسلمين جميعاً .. إنك سميع مجيب الدعا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
عبدالمنعم بتاريخ: 20 سبتمبر 2010 تقديم بلاغ مشاركة بتاريخ: 20 سبتمبر 2010 غفر الله ذنبك وفرج همك وأعزك والمسلمين وجمعنا في مستقر رحمته .. آمين اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
DOMSSA بتاريخ: 23 مايو 2011 تقديم بلاغ مشاركة بتاريخ: 23 مايو 2011 الموضوع الذي سوف أتطرق له هو كيفية عمل tuning لجمل الSQL لزيادة سرعة اخراج المخرجات ، لا أريد أن اطيل عليكم والآن دعونا نبدأ بالخطوات العملية والتي سوف تتركز على المثلة قدر الأمكان:-# القانون الأول : أستخدام Where لفلترة الصفوف:-يتم استخدام where لاخراج البيانات بناء على شرط معين ، واليك المثال الأتي ليتضح الأمر أكثر SELECT * FROM customers; CUSTOMER_ID FIRST_NAME LAST_NAME DOB PHONE ----------- ---------- ---------- --------- ------------ 1 John Brown 01-JAN-65 800-555-1211 2 Cynthia Green 05-FEB-68 800-555-1212 3 Steve White 16-MAR-71 800-555-1213 4 Gail Black 800-555-1214 5 Doreen Blue 20-MAY-70 هذا المثال أخرج جميع الصفوف من جدول الcustomers والآن ماذا سيحصل لو تم اضافة شرط where SELECT * FROM customers WHERE customer_id IN (1, 2); CUSTOMER_ID FIRST_NAME LAST_NAME DOB PHONE ----------- ---------- ---------- --------- ------------ 1 John Brown 01-JAN-65 800-555-1211 2 Cynthia Green 05-FEB-68 800-555-1212 الآن أنظر الى النتائج لقد تم فلترتها بناءً على الشرط whereهذا ما لدي في القانون الاول للSQL tuning اعلم انه قانون يعلمه الكل لكن أنظرني في الدرس القادم .لدي طلب بسيط جداًًًًااااااااااااااااًً وهو (الدعاء لي ولجميع مرضى المسلمين بالشفاء العاجل )لاني والله محتاج للدعااااااااااااااااااااااااااااااااااء الخالص الصادق تكملةً للموضوع السابق :[/code]الموضوع : أستعمال Table Joins أكثر من Multiple Queries: اليكم الشرح بالأمثلة .المثال الأول : يسترجع الname و product_type_id من جدول products للproduct =1المثال الثاني : يستعمل الproduct_type_id لاسترجاع ال name من جدول product_types SELECT name, product_type_id FROM products WHERE product_id = 1; NAME PRODUCT_TYPE_ID ------------------------------ --------------- Modern Science 1 SELECT name FROM product_types WHERE product_type_id = 1; NAME ---------- Book والآن ما رأيكم في دمج هذان الاستعلامين في أتعلام واحد لزيادة الفعالية للنتائج وتقليل عمليات جلب البيانات وكما يلي وباستخدام join بين جدولي products و product_types لاستخراج نفس النتيجة السابقة :- SELECT p.name, pt.name FROM products p, product_types pt WHERE p.product_type_id = pt.product_type_id AND p.product_id = 1; NAME NAME ------------------------------ ---------- Modern Science Book هذا الاستعلام ارجع نفس نتيجة الأستعلامين (الاول والثاني) وبشكل عام : حاول قدر الأمكان استعمال (ONE QUERY) أكثر من (TWO QUERY)انتهى القانون الثاني ، وسوف يكون هناك المزيد أن شاء الله حياكم الله مجدداً أتمنى أن تكون الدروس مفيد قدر المستطاع (تذكر أني أشرح كيفية عمل tuning لجمل الSQL)القانون الثالث:- استخدام Fully Qualified للأعمدة في حالة أستعمال الJoin:-للوهلة الأولى ربما أن مصطلح Fully Qualified جديد على البعض لكن مع الأمثلة سيتضح الأمر أكثر ، اليك الأمثلة ليتضح الأمر :المثال الأول :- يستخدم جدولي products و product_types ويعطيمهما alias بالترتيب p و pt SELECT p.name, pt.name, description, price FROM products p, product_types pt WHERE p.product_type_id = pt.product_type_id AND p.product_id = 1; NAME NAME ------------------------------ ---------- DESCRIPTION PRICE -------------------------------------------------- ---------- Modern Science Book A description of modern science 19.95 أنظر الى الأعمدة description و price لم يتم أضافة alias الخاص بهما أي أن هذا الأستعلام ليس Fully Qualified (مؤهل بالكامل) لجميع الأعمدة ، ربما يسأل أحد ما فائدة وضع جميع الأعمدة في حالة Fully Qualified ، الجواب أن قاعدة البيانات سوف تهدر المزيد من الوقت لكي تبحث عن الأعمدة التي ليس معرف بها الalias لكي تعرف لمن ترجع هذا الأعمدة في الجدوال ، ربما يسأل آخر وهل هذا الوقت الى الدرجة من الأهمية ، الجواب نعم لا، هناك من الأستعلامات من يأخد وقت طويل جداً (5 دقائق مثلاً) فما بالك لو أن الاستعلام كان يحوي العديد من الجدوال والأعمدة ولم يتم استعمال Fully Qualified بشكله الصحيح أكيد أن الوقت سوف يهدر للبحث عن مطابقة الأعمدة مع الجدوال.المثال الثاني : نفس المثال السابق لكن مع أضافة الalias =p للأعمدة description و price :- SELECT p.name, pt.name, p.description, p.price FROM products p, product_types pt WHERE p.product_type_id = pt.product_type_id AND p.product_id = 1; NAME NAME ------------------------------ ---------- DESCRIPTION PRICE -------------------------------------------------- ---------- Modern Science Book A description of modern science 19.95 لاحظ أن النتائج في الأستعلامين متساوين ، ولكن الاستعلام الأول سوف يأخد وقت أكثر من الأستعلام الثاني وذلك لعدم أستعمال Fully Qualified في الاستعلام الاول زخلاصة: في حالة استخدام استعلام يحوي Join Table يجب تطبيق نظرية Fully Qualified في الأعمدة .أتمنى أن أكون قدر أوصلت الفكرة ، وأي استفسار بخصوص هذا الدرس أو الدروس السابقة أنا جاهز أن شاء الله والسلام عليكم القانون الرابع: أستخدام تعابير CASE بدلاً Multiple Queries (الإستفسارات المتعدّدة):-خلينا نفهم هالقانون بالأمثلة حتى يتضح الأمر أكثر.المثال الأول :- هذا المثال يستخدم Multiple Queries لحساب عدد المنتجات خلال أسعار مختلفة : (أيجاد عدد المنتجات التي سعرها أقل من 13) SELECT COUNT(*) FROM products WHERE price < 13; COUNT(*) ---------- 2 (إيجاد عدد المنتجات التي سعرها بين 13 و 15) SELECT COUNT(*) FROM products WHERE price BETWEEN 13 AND 15; COUNT(*) ---------- 5 (إيجاد المنتجات التي سعرها أكبر من 15) SELECT COUNT(*) FROM products WHERE price > 15; COUNT(*) ---------- 5 ما رأيك الآن لو قمنا بدمج هذه الأستفسارات الثلاث في أستفسار واحد بإستخدام الCASE لزيادة الPerformance : SELECT COUNT(CASE WHEN price < 13 THEN 1 ELSE null END) low, COUNT(CASE WHEN price BETWEEN 13 AND 15 THEN 1 ELSE null END) med, COUNT(CASE WHEN price > 15 THEN 1 ELSE null END) high FROM products; LOW MED HIGH ---------- ---------- ---------- 2 5 5 أنظر الى هذا الأستعلام فقد أعطى نفس نتائج الأستعلامات الثلاث السابقة وهذا يزيد من فعالية جلب البيانات من قاعدة البيانات .هذا ما لدي اليوم أتمنى أن أكون قد أوصلت الفكرة مع تمنياتي للجميع بالتوفيق والنجاح. القانون الخامس:- أستخدام Where بدلاً من الHavingكما هو معلوم لدى الجميع أن Where تقوم بفلترة الصفوف rows والHaving قتوم بفلترة مجموعات الصفوف Groups of Rows .ملحوظة : الHaving تقوم بفلترة مجموعات الصفوف بعد أن تقوم بتجميعها كمجموعات وهذا يأخذ بعض الوقت ، لذا يفضل استخدام Where لفلترة الصفوف قدر الأمكان .والآن دعنا نذهب للأمثلة ليتضح الأمر أكثر:-المثال الأول : يسترجع product_type_id ومعدل سعر المنتجات التي product_type_id =1 or 2 :- SELECT product_type_id, AVG(price) FROM products GROUP BY product_type_id HAVING product_type_id IN (1, 2); PRODUCT_TYPE_ID AVG(PRICE) --------------- ---------- 1 24.975 2 26.22 هذا المثال قام بتجميع الproduct_type_id كمجموعات ثم قام بفلترتها بإستخدام Having وهذا أخذ بعض الوقت ، ما رأيك بإستخراج نفس النتائج ولكن بإستخدام Where والتي تأخذ وقت أقل من الوقت المستغرق بإستخدام Having، اليك المثال :- SELECT product_type_id, AVG(price) FROM products WHERE product_type_id IN (1, 2) GROUP BY product_type_id; PRODUCT_TYPE_ID AVG(PRICE) --------------- ---------- 1 24.975 2 26.22 لاحظ ان هذا المثال قام بالفلترة بإستخدام where ثم بعدها قام بتجميعها وهذا قلل الوقت قدر الأمكان.خلاصة : حاول استخدام where لفلترة الصفوف بدلاً من having (قدر الأمكان)أنتهى الدرس والسلام عليكم. # القانون السادس : أستخدام UNION ALL بدلاً من UNION :-كما هو معلوم لدى الجميع أن الUNION ALL يستخدم أستعلامين لجلب جميع الصفوف ومن ضمنها الصفوف المكررة ، لكن الUNION لجلب الصفوف من غير تكرار ، ومن هنا يتضح لنا الUNION تقوم بحذف الصفوف المكررة وهذا يحتاج الى بعض الوقت وهذا هو مربط الفرس أن عملية الUNION تحتاج الى وقت أكثر في التنفيذ من الUNION ALL لان الUNION تحتاج بعض الوقت لحذ الصفوف المكررة.الآن دعنا نذهب الى الأمثلة لتتضح الصورة أكثر.الاستعلام الأتي يستخدم الUNION لجلب الصفوف من جدول products وجدول more_products SELECT product_id, product_type_id, name FROM products UNION SELECT prd_id, prd_type_id, name FROM more_products; PRODUCT_ID PRODUCT_TYPE_ID NAME ---------- --------------- ------------------- 1 1 Modern Science 2 1 Chemistry 3 2 Supernova 3 Supernova 4 2 Lunar Landing 4 2 Tank War 5 2 Submarine 5 2 Z Files 6 2 2412: The Return 7 3 Space Force 9 8 3 From Another Planet 9 4 Classical Music 10 4 Pop 3 11 4 Creative Yell 12 My Front Line لاحظ ان هذا الأستعلام جلب الصفوف من غير تكرار ، أما الأستعلام التالي يستخدم UNION ALL يستخدم جدولي products و more_products لجلب جميع الصفوف بما فيها المكرر :- SELECT product_id, product_type_id, name FROM products UNION ALL SELECT prd_id, prd_type_id, name FROM more_products; PRODUCT_ID PRODUCT_TYPE_ID NAME ---------- --------------- ------------------------------ 1 1 Modern Science 2 1 Chemistry 3 2 Supernova 4 2 Tank War 5 2 Z Files 6 2 2412: The Return 7 3 Space Force 9 8 3 From Another Planet 9 4 Classical Music 10 4 Pop 3 11 4 Creative Yell 12 My Front Line 1 1 Modern Science 2 1 Chemistry 3 Supernova 4 2 Lunar Landing 5 2 Submarine لاحظ ان هذا الاستعلام قام بجلب جميع الصفوف بما فيها المكرر.ملاحظة بسيطة : نحن هنا نشرح كيفية عمل tuning لجمل الSQL لذا فإذا أقتضى البرنامج جلب البيانات من غير تكرار فيجب هنا استخدام الUNION مع أنها تحتاج بعض الوقت لحذف المكرر لكن حاجة البرنامج هنا أهم .أنتهى الدرس متمنياً للجميع التوفيق والنجاح ، ولا يسعني هنا الأ أن أشكر القائمين على هذا المنتدى الرائع والذي أفتخر بأني عضو فيه وأشكر القائمين على المنتدى لثبيت الموضوع.والسلام عليكم. القانون السابع : أستخدام EXISTS بدلاً من IN لنرى ما قصة هذا القانون : أن IN تستخدم لعمل تشيك في حالة كون القيمة موجودة في قائمة(list) ، ولكن EXISTS تختلف حيث تعمل تشيك لوجود الصفوف بينما أن IN تشيك القيم الفعلية ، لذا فإن EXISTS تعطي كفاءة أفضل من IN في حالة استخدام subqueries . واليك الأمثلة ليتضح الأمر أكثر :-اليك هذا الأستعلام الذي يستخدم IN لأسترجاع المنتجات التي تم شرائها. SELECT product_id, name FROM products WHERE product_id IN (SELECT product_id FROM purchases); PRODUCT_ID NAME ---------- ----------------------------- 1 Modern Science 2 Chemistry 3 Supernova ما رأيك لو أعدنا كتابة هذا الجملة بإستخدام EXISTS SELECT product_id, name FROM products outer WHERE EXISTS (SELECT 1 FROM purchases inner WHERE inner.product_id = outer.product_id); PRODUCT_ID NAME ---------- ----------------------------- 1 Modern Science 2 Chemistry 3 Supernova والخلاصة حاول أستخدام EXISTS بدلاً من IN في حالة استعمال subqueries .أنتهى الدرس متمنياً للجميع التوفيق والنجاح . وجزاكم الله خيراً القانون الثامن : أستخدم EXISTS بدلاً من DISTINCT من المعلوم لدى الجميع أن DISTINCT تستخدم لحذف الصفوف المكررة ، بينما أن EXISTS تستخدم لعمل تشيك لوجود صفوف معينة ، لعل البعض يسأل ما مدى علاقة ذلك بموضوع Performance Sql Tuning ، ولفهم ذلك أقول أنه يجب أستخدام EXISTS بدلاً من DISTINCT (وذلك لأن الDISTINCT تقوم بترتيب الصفوف المسترجعة قبل أجراء حذف للصفوف المكررة وهذا يأخد بعض الوقت وهنا مربط الفرس) وليتضح الأمر أنظر الى المثال الأتي :-* هذا المثال يستخدم DISTINCT لأسترجاع المنتجات التي تم شرائها :- SELECT DISTINCT pr.product_id, pr.name FROM products pr, purchases pu WHERE pr.product_id = pu.product_id; PRODUCT_ID NAME ---------- ----------------------------- 1 Modern Science 2 Chemistry 3 Supernova ولو حاولنا أعادة المثال بإستخدام EXISTS فسوف يأخد وقت اقل من الDISTINCT SELECT product_id, name FROM products outer WHERE EXISTS (SELECT 1 FROM purchases inner WHERE inner.product_id = outer.product_id); PRODUCT_ID NAME ---------- ----------------------------- 1 Modern Science 2 Chemistry 3 Supernova الخلاصة : حاول أستخدم EXISTS بدلاً من DISTINCT لأن عملية الDISTINCT تأخد بعض الوقت (ترتيب الصوف ثم حذف الصفوف المكررة)وفي نهاية شرح هذا الموضوع أشكر كل من ساهم انجاز هذا العمل والسلام عليكم ورحمة الله وبركاته بسم الله الرحمن الرحيم بجد ما اجمل هذة الدروس فعلا روعة ياريت يا جماعة اى عضو عندة فكرة عن Tuning انا عملت Search على المنتدى مفيش مشاركات كتير او مفيش مشاركة حلوة غير المشاركة دى فقط ياريت اى عضو عن فكرة يعمل لينا مواضيع او مشاركات مميزة مثل هذة المشاركة دىوكمان عاوزين حاجات ليها علاقة Order فى ترتيب اى Table يشتغل الاول وكمان فية حاجات اسمها Full index وكمان ترتيب Index وحاجات كتير فى Tuning علشان انا معرفش حاجة فى المجال دة ومطلوبة فى شغلى جدا اليومين دول والله المستعان 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ahmedmohamedali بتاريخ: 26 يوليو 2015 تقديم بلاغ مشاركة بتاريخ: 26 يوليو 2015 بارك الله فيك و ربنا يزيدك علم و ينفعك و تنفع المسلمين بيه اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.