صفحة 1 من 2 12 الأخيرةالأخيرة
النتائج 1 إلى 15 من 22

الموضوع: [دروس تقليل الاستعلامات] - استعلام الـ SELECT لأكثر من جدول

  1. #1
    عضو نشيط
    تاريخ التسجيل
    Aug 2007
    المشاركات
    73

    [دروس تقليل الاستعلامات] - استعلام الـ SELECT لأكثر من جدول



    السلام عليكم ورحمة الله وبركاته

    يرجى مراجعة http://www.swalif.net/softs/swalif45/softs251335/

    بما ان البرمجة قريبه جدا من الرياضيات ان لم تكن هي كذلك بالفعل.. فافضل طريقه للشرح هي بتطبيق مثال

    بفرض ان لدينا 3 جداول
    الاول categories ويحتوي على
    كود:
    cat_id
    cat_name
    والثاني books ويحتوي على
    كود:
    book_id
    book_name
    book_author_id
    book_cat_id
    والثالث authors ويحتوي على
    كود:
    author_id
    author_name
    ونريد عمل صفحه لعرض اخر 10 كتب
    فكيف يتم ذلك ؟؟

    قد يقول شخص سهله.. وذلك بعمل استعلام اولي عن الكتب بالاستعلام التالي
    كود PHP:
    SELECT book_idbook_name FROM books LIMIT 0,10 
    وعندما نقوم بفرز المصفوفه نعمل استعلامين اخرين عن الاول عن اسم الكاتب
    كود PHP:
    SELECT author_name FROM authors WHERE author_id $book_author_id 
    والثاني عن اسم القسم
    كود PHP:
    SELECT cat_name FROM categories WHERE cat_id $book_cat_id 
    بالفعل لقد استعطت اتمام المطلوب..
    ولكن انتظر هل تعلم كم استعلام فعلت؟؟
    الاستعلام الاساسي = 1
    وفي كل عملية فرز ( ونحن مازلنا في التكرار) نقوم بعمل استعلامين اي استعلامين * الحد الاقصى للصفوف في الاستعلام الاساسي
    اي 2 * 10 = 20 + الاستعلام الاساسي = 21 استعلام!!!!

    حسنا يمكننا تنفيذها باستعلام واحد وهو الاستعلام الاساسي ونحن في عملية الفرز نقوم بتخزين معرفات الكتب في متغير واحد ونفصل بينهم بعلام الـ
    كود:
    ,
    ونفس الشيء بالنسبة لأسماء المؤلفين وبعد الانتهاء نقوم بعمل استعلامين الاول للكتب والثاني للمؤلفين وذلك باستخدام خاصية
    كود PHP:
    WHERE cat_id IN ($all_cats
    هذا افضل بكثير.. حيث اننا عملنا المطلوب بـ 3 استعلامات...
    ولكن هل هناك طريقة افضل؟؟

    قد يقول شخص نعم.. وذلك باستخدام اوامر ال JOIN وبذلك نستطيع عملها باستعلام واحد فقط...
    ممتاز..
    ولكننا لا نريد تقليل الاستعلامات على حساب ارهاق خادم الmysql هذا بالاضافة الى اننا نريد الحصول على النتائج باقصى سرعة ممكنه.. وبما ان اوامر ال joins بطيئه بسبب قيامها بانشاء جدول مؤقت لفرز القيم التي نريدها.. فهي لن تفي بالغرض.....

    اذا ما الحل؟؟؟؟ كيف نقوم بعمل ذلك باستعلام واحد؟؟ كيف ندمج الثلاث جداول بحسب مانريد؟؟ بشرط ان لا تكون مرهقه للخادم وتكون سريعه؟؟
    بسيطه..
    تابع معي..

    القاعده:
    كود:
    SELECT
        prefix_1.field_1 , 
        prefix_2.field_2 , 
        prefix_3.field_3 , 
        ...
    FROM
        table_1 prefix_1 ,
        table_2 prefix_2 ,
        table_3 prefix_3 ,
        ...
    WHERE
        prefix_1.field_1 = 'something' AND
        prefix_2.field_4 = prefix_3.field_5 OR
        ...
    حيث ان
    prefix_X = اسم افتراضي نقوم نحن بتعيينه للتمييز بين الجداول التي نريد الاستعلام منها.. والاهي هو لاخبار خادم القاعده باننا نقصد الجدول الفلاني عن طريق هذا الاسم وذلك حينما نقوم بكتابة اسم الجدول بعد صيغة FROM
    field_Y = اسم الحقل
    table_Z = اسم الجدول
    table_1 prefix_1 اخبرنا الخادم انن نقصد بالـ prefix_1 انه تابع للجدول table_1


    وبتطبيق القاعده على فرضيتنا السابقه
    كود PHP:
    SELECT
        bks
    .book_id 
        
    bks.book_name 
        
    cats.cat_name 
        
    athrs.author_name
    FROM
        books bks
    ,
        
    categories cats,
        
    authors athrs
    WHERE
        bks
    .book_author_id athrs.author_id AND 
        
    bks.book_cat_id cats.cat_id
    LIMIT 0
    ,10 
    كود:
    bks.book_author_id = athrs.author_id
    اشترطنا ان تكون قيمة معرف المؤلف الموجوده في جدول الكتب مساوية لقيمة قيمة معرف المؤلف الموجوده في جدول المؤلفين وذلك ليقوم بارجاع اسم المؤلف من جدول المؤلفين الذي سبق وحددناه عن طريق
    كود:
    athrs.author_name
    كود:
    bks.book_cat_id = cats.cat_id
    بالضبط مثل السابق ولكن تتم المقارنه لـ قيمة معرف القسم وارجاع اسمه



    الدرس القادم بمشيئة الله سيكون عن الـ UPDATE لأكثر من جدول وأكثر من قيمة


    اتمنى ان يكون الدرس قد افادكم قبل ان يعجبكم
    فان كان كذلك.. فلا تبخلو بدعوه صادقه لي ولأهلي بالتوفيق والمغفره

    بالتوفيق





    __________________
    مملكة الموت
    =======================
    100(سبحان الله وبحمده ،،، سبحان الله العظيم) = 0 سيئة


  2. #2
    عضو فعال
    تاريخ التسجيل
    Feb 2008
    المشاركات
    1,759


    اللهم ادخلك فسيح جناته





    __________________
    FaceBook Application Developer
    تعلم برمجة سكريبت جلب المحتوى خطوة بخطوة
    مشروعى داخل معرض الاتصالات
    لمراسلتي إضغط هنا
    سبحان الله وبحمده سبحان الله العظيم

  3. #3
    عضو نشيط
    تاريخ التسجيل
    Jan 2008
    المشاركات
    213


    ما شاء الله عليك

    شرح كافي ووافي ومفهوم

    ربي يعطيك العافيه ويزيدك من العلم
    ومستنيين الدرس القادم باذن الله

    تقبل مني فائق الشكر والاحترام






  4. #4
    عضو نشيط جدا
    تاريخ التسجيل
    Aug 2007
    المشاركات
    597


    ما شاء الله عليك

    مشكور اخي العزيز ..






  5. #5
    عضو سوبر نشيط
    تاريخ التسجيل
    Nov 2005
    المشاركات
    779


    ما شاء الله
    جاري التجربة و التحقق .. و ان شاء الله الامور ظابطه ظابطه





    __________________
    أهلا و سهلا بكم في :-
    موقع دار الأوائل
    تفضل معنا خدمات الاستضافة
    موقع العبقري لخدمات الاستضافة

  6. #6


    جربت طريقتك وطريقة join مع تعليمة ضخمة في الفي بولتن
    نفس الوقت

    المثال

    هذه تعليمة من في بولتن

    كود PHP:
    SELECT 
        userfield
    .*, usertextfield.*, user.*, UNIX_TIMESTAMP(passworddate) AS passworddateuser.languageid AS saved_languageid,
        IF(
    displaygroupid=0user.usergroupiddisplaygroupid) AS displaygroupid,
        
    language.phrasegroup_global AS phrasegroup_global,
        
    language.phrasegroup_holiday AS phrasegroup_holiday,
        
    language.options AS lang_options,
        
    language.languagecode AS lang_code,
        
    language.charset AS lang_charset,
        
    language.locale AS lang_locale,
        
    language.imagesoverride AS lang_imagesoverride,
        
    language.dateoverride AS lang_dateoverride,
        
    language.timeoverride AS lang_timeoverride,
        
    language.registereddateoverride AS lang_registereddateoverride,
        
    language.calformat1override AS lang_calformat1override,
        
    language.calformat2override AS lang_calformat2override,
        
    language.logdateoverride AS lang_logdateoverride,
        
    language.decimalsep AS lang_decimalsep,
        
    language.thousandsep AS lang_thousandsep
        
    FROM user 
    AS user
    LEFT JOIN userfield 
    AS userfield ON (user.userid userfield.userid)
    LEFT JOIN usertextfield AS usertextfield ON (usertextfield.userid user.useridLEFT JOIN language AS language ON (language.languageid = IF(user.languageid 01user.languageid)) 

    WHERE user.userid 
    أخذت 0.0016 ثانية

    وهذه التعليمة بطريقتك
    كود PHP:
    SELECT 
        userfield
    .*, usertextfield.*, user.*, UNIX_TIMESTAMP(passworddate) AS passworddateuser.languageid AS saved_languageid,
        IF(
    displaygroupid=0user.usergroupiddisplaygroupid) AS displaygroupid,
        
    language.phrasegroup_global AS phrasegroup_global,
        
    language.phrasegroup_holiday AS phrasegroup_holiday,
        
    language.options AS lang_options,
        
    language.languagecode AS lang_code,
        
    language.charset AS lang_charset,
        
    language.locale AS lang_locale,
        
    language.imagesoverride AS lang_imagesoverride,
        
    language.dateoverride AS lang_dateoverride,
        
    language.timeoverride AS lang_timeoverride,
        
    language.registereddateoverride AS lang_registereddateoverride,
        
    language.calformat1override AS lang_calformat1override,
        
    language.calformat2override AS lang_calformat2override,
        
    language.logdateoverride AS lang_logdateoverride,
        
    language.decimalsep AS lang_decimalsep,
        
    language.thousandsep AS lang_thousandsep
        
    FROM

    user user
    userfield userfield
    usertextfield usertextfield
    language language

    where

    user
    .userid userfield.userid AND
    usertextfield.userid user.userid AND
    language.languageid = IF(user.languageid 01user.languageid) AND
    user.userid 

    أخذت 0.0016 ثانية

    أعتقد طريقتك هي join أصلاً حتي لو لم تكتب النص في الكويري
    فهو سيقوم بعمل الجدول الإفتراضي لعمل الجداول ومساواتها والعودة بالجدول الجديد

    مادمت جمعت جدولين مع مساواة البريماري كي من جدول مع الثاني فأنت عملت جوين مهما كان النص





    __________________
    السيف أصدق أنباء من الكتب

  7. #7
    عضو شرف
    تاريخ التسجيل
    Apr 2002
    المشاركات
    1,379


    تقليل الاستعلامات ... او دعونا نسميها "تحسين الاستعلامات" (Optimize Query) سواء بتقليلها اعادة صياغتها , حسب ماهو معروف ان عملية الدمج join سواع left او right او inner وغيره مهمه جدا لاستخاص النتيجه بشكل كامل بدون تكرار العمليه مرار .
    - ما عمله DSQ8.com في الاستعلام النهائي هو فعلا كما قال "المجروح" عملية دمج وبالتحديد INNER JOIN في sql قد تختلف طريقة كتابة الاستعلام لكن عملية معالجتها تكون بنفس الطريقة .

    - الطريقة المثلى و"اعتقد" انها افضل اداء (هل يجرب احدكم ويخبرنا) هو استخدام من الجدول الاساسي والدمج من ناحيه واحده (LEFT JOIN)مع جداول اخرى ... وحسب مثالنا سوف نحصل على جميع الكتب وكل كتاب سيكون معه بينات القسم (لا يشترط وجوده) + بينات المؤلف(لا يشترط وجوده) . بهذا الشكل:

    كود PHP:
    SELECT
        bks
    .book_id 
        
    bks.book_name 
        
    cats.cat_name 
        
    athrs.author_name
    FROM books bks
    LEFT JOIN authors athrs ON bks
    .book_author_id athrs.author_id
    LEFT JOIN categories cats ON bks
    .book_cat_id cats.cat_id
    LIMIT 0
    ,10 






    __________________
    ضيف الله العتيبي مبرمج حر و مهندس معتمد من زيند (ZCE)
    الاتصال: daif@daif.net او جوال: 0556639884
    الخدمات: تقديم استشارات برمجيه, تطوير بوابات/خدمات إلكترونيه للقطاع العام او الخاص .

  8. #8
    عضو جديد
    تاريخ التسجيل
    Aug 2008
    المشاركات
    2


    الله يعطيك العافية حبيبنا ..






  9. #9
    عضو نشيط
    تاريخ التسجيل
    Aug 2007
    المشاركات
    73


    اللهم آمين يارب العالمين... وان شاء الله اجمعين
    سعدت جدا بدعائك تقبل تحيتي

    ما شاء الله عليك

    شرح كافي ووافي ومفهوم

    ربي يعطيك العافيه ويزيدك من العلم
    ومستنيين الدرس القادم باذن الله

    تقبل مني فائق الشكر والاحترام
    الله يعافيك عزيزي.. وان شاء الله الدرس القادم سيكون متوفر خلال دقائق

    ما شاء الله عليك

    مشكور اخي العزيز ..
    لا شكر على واجب عزيزي... فزكاة العلم نشره

    ما شاء الله
    جاري التجربة و التحقق .. و ان شاء الله الامور ظابطه ظابطه
    اهلا احمد ان شاء الله ظابطه :nice: لا تنسى اخبارنا بالنتيجه


    عزيزي المجروح ، عزيزي ضيف
    شكرا لكما للتوضيح.. فمازلت اتعلم كالجميع :app:

    الله يعطيك العافية حبيبنا ..
    الله يعافيك عزيزي





    __________________
    مملكة الموت
    =======================
    100(سبحان الله وبحمده ،،، سبحان الله العظيم) = 0 سيئة

  10. #10
    عضو سوبر نشيط
    تاريخ التسجيل
    Mar 2003
    المشاركات
    790


    الطريقة التي قالها "صاحب الموضوع" لا تقوم بتخفيف الضغط على قواعد البيانات
    كما أن الطريقة التي وضعها "ضيف" لا تقوم بذلك أيضاً
    هذا نتيجة أن الـSQL تعتمد في عملها على الـData Base Algebra Expressions و في كلتا الحالتين تقوم الـSQL بعمل Cartesian Product للجداول المطلوبة ثم عمل Projection حسب الشرط .. بالعكس فقد تضيف طريقة "ضيف" المزيد من الصفوف في الجدول المؤقت الذي تقوم SQL بإنشائه و قد تتواجد فيه العديد من الـNULL values ..

    Dr.no





    __________________
    دكتور لا

  11. #11
    عضو نشيط جدا
    تاريخ التسجيل
    Jan 2008
    المشاركات
    553


    بورك فيك





    __________________
    اللهم اغفر لي الذنوب التي تهتك العصم
    اللهم اغفر لي الذنوب التي تنزل النقم
    اللهم اغفر لي الذنوب التي تغير النعم
    اللهم اغفر لي الذنوب التي تحبس الدعاء
    اللهم اغفر لي الذنوب التي تنزل البلاء .

  12. #12
    عضو شرف
    تاريخ التسجيل
    Apr 2002
    المشاركات
    1,379


    بعد التجربة على جدولين تبين ان INNER JOIN أسرع من LEFT JOINN بشكل كبير .. وهذا عكس ما توقعت تمام ... اذا سيصبح الاستعلام بهذا الشكل: (لا فرق بين inner join او الفصل بفاصله بين اسماء الجداول)
    كود PHP:
     SELECT
        bks
    .book_id 
        
    bks.book_name 
        
    cats.cat_name 
        
    athrs.author_name
    FROM books bks
    INNER JOIN authors athrs ON bks
    .book_author_id athrs.author_id
    INNER JOIN categories cats ON bks
    .book_cat_id cats.cat_id
    LIMIT 0
    ,10 
    اهلا "Dr.no" اذا ماهي برايك الطريقة لتخفيف الضغط عن قواعد البينات ... أعتقد انك ستوافقني الراء في ان يتم فهرسة الحقول التى تستخدم في الربط او شيء من هذا القبيل .





    __________________
    ضيف الله العتيبي مبرمج حر و مهندس معتمد من زيند (ZCE)
    الاتصال: daif@daif.net او جوال: 0556639884
    الخدمات: تقديم استشارات برمجيه, تطوير بوابات/خدمات إلكترونيه للقطاع العام او الخاص .

  13. #13
    عضو سوبر نشيط
    تاريخ التسجيل
    Mar 2003
    المشاركات
    790


    أهلاً "ضيف" ،، الفهرسة Indexing قد تكون حلاً جيداً ، لمزيد من المعلومات : http://publib.boulder.ibm.com/infoce...ajq/gotips.htm
    بخصوص التجربة التي قمت بها فهذا ما قمت بشرحه في ردي السابق
    شاكر لك تعقيبك ..

    Dr.no





    __________________
    دكتور لا

  14. #14
    عضو شرف
    تاريخ التسجيل
    Apr 2002
    المشاركات
    1,379


    هنا تجربه اخرى على قواعد البينات Oracle 9i على جدولين فعليين , تفيد ان LEFT JOIN اسرع ... وهذا ما تحدث عنه سابقا...

    الجدولين: DF_INBOX يحتوى 833,566 صف و DF_INBOX_DTL يحتوى 1,475,225 صف والربط بينهما ب INBOX_NO وهو مفهرس ايضا .
    - البحث من جدوليين بتاريخ محدد INNER JOIN مدة تنفيذ 3 ثواني , الناتج 53 صف .
    كود PHP:
    SELECT FROM DF_INBOX 
    INNER JOIN DF_INBOX_DTL ON DF_INBOX
    .INBOX_NO DF_INBOX_DTL.INBOX_NO
    WHERE DF_INBOX
    .INCOMING_DATE '1426/01/01' 
    - البحث من جدوليين بتاريخ محدد LEFT JOIN مدة تنفيذ اقل من ثانيه, الناتج 53 صف.
    كود PHP:
    SELECT FROM DF_INBOX 
    LEFT  JOIN DF_INBOX_DTL ON DF_INBOX
    .INBOX_NO DF_INBOX_DTL.INBOX_NO
    WHERE DF_INBOX
    .INCOMING_DATE '1426/01/01' AND  DF_INBOX_DTL.INBOX_NO IS NOT NULL 
    ماهو الفرق بين التعليميتين او بين MySQL و Oracle ؟
    - في Mysql استخدم INNER JOIN .
    - في Oracle استخجم LEFT JOIN .





    __________________
    ضيف الله العتيبي مبرمج حر و مهندس معتمد من زيند (ZCE)
    الاتصال: daif@daif.net او جوال: 0556639884
    الخدمات: تقديم استشارات برمجيه, تطوير بوابات/خدمات إلكترونيه للقطاع العام او الخاص .

  15. #15
    عضو سوبر نشيط
    تاريخ التسجيل
    Mar 2003
    المشاركات
    790


    أهلاً "ضيف" ..
    غريبة هذه التجربة .. قد تكون الفهرسة ...
    أو قد تكون Oracle حيث أنها معروفة بقوتها في هذا المجال ..





    __________________
    دكتور لا





ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

أضف موقعك هنا| اخبار السيارات | حراج | شقق للايجار في الكويت | بيوت للبيع في الكويت | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض