דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. איך עושים JOIN?

איך עושים JOIN?

מתוזמן נעוץ נעול הועבר תכנות
56 פוסטים 4 כותבים 755 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • nigunN מנותק
    nigunN מנותק
    nigun
    השיב לOdedDvir ב נערך לאחרונה על ידי
    #16

    @OdedDvir אמר באיך עושים JOIN?:

    @nigun אמר באיך עושים JOIN?:

    אולי אני ישאיר את זה לחצי שעה

    אני עדיין מציע לך לבצע סינון WHERE לפי הקבוצה לפני הJOIN, ולהרוויח את הזמן הזה:

    SELECT P.user, P.points,I.nameText
    FROM (SELECT * FROM points WHERE points.grup=123) AS P
    JOIN (SELECT * FROM userinfo WHERE userinfo.grup=123) AS I
    ON P.user=I.user; 
    

    יפה
    עכשיו זה ירד ל0.23 שניות.

    מייל: nigun@duck.com

    תגובה 1 תגובה אחרונה
    1
    • dovidD מנותק
      dovidD מנותק
      dovid ניהול
      כתב ב נערך לאחרונה על ידי
      #17

      בדרך כלל המסד נתונים לבד בוחר לבצע סינון לפני הJOIN אם יש לו אינדיקציות ברורות שזה שווה.

      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

      בכל נושא אפשר ליצור קשר dovid@tchumim.com

      nigunN תגובה 1 תגובה אחרונה
      1
      • nigunN מנותק
        nigunN מנותק
        nigun
        השיב לdovid ב נערך לאחרונה על ידי
        #18

        @dovid
        אז מה השתבש אצלי?

        מייל: nigun@duck.com

        dovidD תגובה 1 תגובה אחרונה
        0
        • dovidD מנותק
          dovidD מנותק
          dovid ניהול
          השיב לnigun ב נערך לאחרונה על ידי
          #19

          @nigun זה מה שאני שואל את עצמי לאורך כל האשכול.

          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

          בכל נושא אפשר ליצור קשר dovid@tchumim.com

          תגובה 1 תגובה אחרונה
          1
          • OdedDvirO מנותק
            OdedDvirO מנותק
            OdedDvir
            השיב לnigun ב נערך לאחרונה על ידי
            #20

            @nigun אמר באיך עושים JOIN?:

            מעניין מה ההבדל?

            כתבתי למעלה, שמשום מה סדר הריצה של המסד נתונים שלך היה קודם כל לבצע JOIN (מה שיצר כנראה מליוני רשומות) ורק אח"כ סינון ב-WHERE.
            תוסיף את העניין שמדובר ב-JOIN של מחרוזות שגם הוא איטי בהרבה מJOIN של מספרים - וקיבלת חצי שעה של תעסוקה למעבד...

            @dovid אמר באיך עושים JOIN?:

            בדרך כלל המסד נתונים לבד בוחר לבצע סינון לפני הJOIN אם יש לו אינדיקציות ברורות שזה שווה.

            אולי עדיף לא להשאיר את הדבר בידיים של הDB איפה שאפשר בקלות לקבוע את הסדר כדלעיל?

            dovidD תגובה 1 תגובה אחרונה
            1
            • nigunN מנותק
              nigunN מנותק
              nigun
              כתב ב נערך לאחרונה על ידי
              #21

              בהמשך לשאלה הנ"ל
              לפעמים יש משתמשים שלא רשומים ב userinfo
              אבל אני בכל זאת אני רוצה לקבל את הרשומה שלהם בpoints
              איך אני כותב את השאילתא?

              מייל: nigun@duck.com

              OdedDvirO תגובה 1 תגובה אחרונה
              0
              • OdedDvirO מנותק
                OdedDvirO מנותק
                OdedDvir
                השיב לnigun ב נערך לאחרונה על ידי
                #22

                @nigun בעיקרון אתה כותב LEFT JOIN במקום JOIN

                dovidD תגובה 1 תגובה אחרונה
                2
                • dovidD מנותק
                  dovidD מנותק
                  dovid ניהול
                  השיב לOdedDvir ב נערך לאחרונה על ידי dovid
                  #23

                  LEFT JOIN זה למקרה שאתה רוצה את כל השורות של הטבלה שצויינה ראשונה (שזה לשמאל הביטוי JOIN). למקרה הפוך יש RIGHT JOIN. הברירת מחדל היא INNER שזה רק הזהים, ויש את FULL שזה הכל משני הצדדים. בחלק ממסדי הנתונים האחרון לא נתמך.

                  מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                  בכל נושא אפשר ליצור קשר dovid@tchumim.com

                  תגובה 1 תגובה אחרונה
                  4
                  • dovidD מנותק
                    dovidD מנותק
                    dovid ניהול
                    השיב לOdedDvir ב נערך לאחרונה על ידי
                    #24

                    @OdedDvir אמר באיך עושים JOIN?:

                    אולי עדיף לא להשאיר את הדבר בידיים של הDB איפה שאפשר בקלות לקבוע את הסדר כדלעיל?

                    זה לגיטימי לעיתים נדירות, אחרת הרסת את כל הרעיון של SQL ("תגיד מה אתה רוצה, אני אדאג לאיך").
                    מקרה שבו הDB כ"כ מזייף הוא משונה מאוד. ב99% מהמקרים הDB חכם מספיק לעשות את הסדר הכי טוב.

                    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                    בכל נושא אפשר ליצור קשר dovid@tchumim.com

                    OdedDvirO תגובה 1 תגובה אחרונה
                    2
                    • OdedDvirO מנותק
                      OdedDvirO מנותק
                      OdedDvir
                      השיב לdovid ב נערך לאחרונה על ידי OdedDvir
                      #25

                      @dovid אמר באיך עושים JOIN?:

                      זה לגיטימי לעיתים נדירות, אחרת הרסת את כל הרעיון של SQL ("תגיד מה אתה רוצה, אני אדאג לאיך").

                      אני עדיין אוחז ב"תגיד מה אתה רוצה ועדיין תדאג"...

                      מקרה שבו הDB כ"כ מזייף הוא משונה מאוד. ב99% מהמקרים הDB חכם מספיק לעשות את הסדר הכי טוב.

                      מעניין לראות את תוכנית הריצה של השאילתא הארוכה. אם @nigun יוכל להראות אותה כאן (כמובן רק אם זה לא ידרוש שוב חצי שעה...)

                      dovidD nigunN 2 תגובות תגובה אחרונה
                      1
                      • dovidD מנותק
                        dovidD מנותק
                        dovid ניהול
                        השיב לOdedDvir ב נערך לאחרונה על ידי
                        #26

                        @OdedDvir אמר באיך עושים JOIN?:

                        @dovid אמר באיך עושים JOIN?:

                        זה לגיטימי לעיתים נדירות, אחרת הרסת את כל הרעיון של SQL ("תגיד מה אתה רוצה, אני אדאג לאיך").

                        אני עדיין אוחז ב"תגיד מה אתה רוצה ועדיין תדאג"...

                        זה לא נורמלי, במקרים רגילים אמורים להיות רגועים לחלוטין.
                        מצב בו חושבים מה יותר יעיל בכל שאילתה אינו הגיוני כי SQL מסתיר המון מידע, פרטים פיזיים וטכניים שקריטיים לאיך לבצע את השאילתה. כל עוד הוא אחראי אתה סומך על ידיעותיו, אבל אם אתה נהיה "אחראי" למיטוב השאילתות, אתה מגשש באפילה עם סברות שלא תמיד בקנה אחד עם המצב הטכני של הנתונים.

                        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                        בכל נושא אפשר ליצור קשר dovid@tchumim.com

                        OdedDvirO תגובה 1 תגובה אחרונה
                        3
                        • OdedDvirO מנותק
                          OdedDvirO מנותק
                          OdedDvir
                          השיב לdovid ב נערך לאחרונה על ידי
                          #27

                          @dovid אמר באיך עושים JOIN?:

                          זה לא נורמלי, במקרים רגילים אמורים להיות רגועים לחלוטין.

                          אני משער שכך הוא בבסיסי נתונים מקצועיים.
                          לצערי אני מגיע משדה הקרב של Access, שם Jet לא מגיע לרמות של אופטימיזציה כזו, נוכחתי לדעת ששאילתא שלקחה לי למעלה מ-4 דקות עם הרבה Join-ים הפכה ל-3 שניות כשסידרתי אותה מחדש (עם טבלאות זמניות וכו').

                          נו, עוד מסמר בארון של אקסס...

                          dovidD תגובה 1 תגובה אחרונה
                          1
                          • dovidD מנותק
                            dovidD מנותק
                            dovid ניהול
                            השיב לOdedDvir ב נערך לאחרונה על ידי
                            #28

                            @OdedDvir אני חושב שגם אקסס הוא בסדר יחסית. אתה מדבר על שאילות רציניות מאוד, והראיה שאתה מזכיר טבלאות זמניות.

                            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                            בכל נושא אפשר ליצור קשר dovid@tchumim.com

                            OdedDvirO תגובה 1 תגובה אחרונה
                            1
                            • OdedDvirO מנותק
                              OdedDvirO מנותק
                              OdedDvir
                              השיב לdovid ב נערך לאחרונה על ידי OdedDvir
                              #29

                              @dovid אמר באיך עושים JOIN?:

                              אתה מדבר על שאילות רציניות מאוד

                              נכון, היו שם לפחות 20 Join-ים של שאילתות שונות.
                              לפי זכרוני עיקר הבעיה שם הייתה שהייתה שאילתא מאוד בסיסית שעושה סינון על טבלה (כדי לשלוף רק את הנתונים הרלוונטיים למערכת) והרבה מהשאילתות הנ"ל התבססו עליה (כדי לחשב כל אחת את הדרוש לה) ואח"כ בוצע Join. זה גרם קריאות רבות לאותה שאילתא, והפתרון היה טבלת עזר זמנית.

                              תגובה 1 תגובה אחרונה
                              0
                              • nigunN מנותק
                                nigunN מנותק
                                nigun
                                השיב לOdedDvir ב נערך לאחרונה על ידי
                                #30

                                @OdedDvir אמר באיך עושים JOIN?:

                                מקרה שבו הDB כ"כ מזייף הוא משונה מאוד. ב99% מהמקרים הDB חכם מספיק לעשות את הסדר הכי טוב.

                                מעניין לראות את תוכנית הריצה של השאילתא הארוכה. אם @nigun יוכל להראות אותה כאן (כמובן רק אם זה לא ידרוש שוב חצי שעה...)

                                לא אכפת לי להעסיק את המכונה שלי לעוד חצי שעה (תופס סך הכל ליבה אחת)
                                אבל אני לא יודע איך מציגים את התוכנית ריצה?

                                מייל: nigun@duck.com

                                OdedDvirO תגובה 1 תגובה אחרונה
                                0
                                • OdedDvirO מנותק
                                  OdedDvirO מנותק
                                  OdedDvir
                                  השיב לnigun ב נערך לאחרונה על ידי
                                  #31

                                  @nigun התחביר הוא:

                                  EXPLAIN ANALYZE <SQL>
                                  

                                  כלומר:

                                  EXPLAIN ANALYZE SELECT points.user, points.points FROM points JOIN info ON info.user=points.user
                                  
                                  nigunN תגובה 1 תגובה אחרונה
                                  3
                                  • nigunN מנותק
                                    nigunN מנותק
                                    nigun
                                    השיב לOdedDvir ב נערך לאחרונה על ידי
                                    #32

                                    @OdedDvir
                                    נראה שזה לא זמין בגירסת MYSQL שלי
                                    אז עשיתי EXPLAIN EXTENDED

                                    +----+-------------+----------+------+---------------+------+---------+------+--------+----------+----------------------------------------------------+
                                    | id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra                                              |
                                    +----+-------------+----------+------+---------------+------+---------+------+--------+----------+----------------------------------------------------+
                                    |  1 | SIMPLE      | userinfo | ALL  | NULL          | NULL | NULL    | NULL |  30410 |   100.00 | NULL                                               |
                                    |  1 | SIMPLE      | points   | ALL  | NULL          | NULL | NULL    | NULL | 359834 |   100.00 | Using where; Using join buffer (Block Nested Loop) |
                                    +----+-------------+----------+------+---------------+------+---------+------+--------+----------+----------------------------------------------------+
                                    
                                    

                                    מייל: nigun@duck.com

                                    OdedDvirO תגובה 1 תגובה אחרונה
                                    0
                                    • OdedDvirO מנותק
                                      OdedDvirO מנותק
                                      OdedDvir
                                      השיב לnigun ב נערך לאחרונה על ידי
                                      #33

                                      @nigun איזו גירסא יש לך?

                                      nigunN תגובה 1 תגובה אחרונה
                                      0
                                      • nigunN מנותק
                                        nigunN מנותק
                                        nigun
                                        השיב לOdedDvir ב נערך לאחרונה על ידי
                                        #34

                                        @OdedDvir
                                        mysql 5.6.49

                                        מייל: nigun@duck.com

                                        תגובה 1 תגובה אחרונה
                                        0
                                        • dovidD מנותק
                                          dovidD מנותק
                                          dovid ניהול
                                          כתב ב נערך לאחרונה על ידי dovid
                                          #35

                                          @nigun הסתקרנתי פתאום יותר אז עליתי לראות את מבנה הנתונים.
                                          הוא לא היה קריא (ולכן עזבתי בפעמים הקודמות שביקרתי את הנושא, בלי לבדוק...)
                                          ערכתי את הודעתך ועיצבתי את הקוד.
                                          ובכן, השאלה שמייד עולה זה למה לעשות JOIN בין שני עמודות שאינם שדה מפתח. למה השדה user בpoints לא מצביע על הid של שבטבלה userinfo? (ואיך זה שאורכי השדות של הvarchar בשני שדות הuser לא זהים, זה לא כ"כ הגיוני).

                                          אגב גירסת הmysql: בכל אובנטו מתקינים בד"כ mysql כמו ילדים טובים מהמנהל חבילות ונתקעים עם הגירסה המיושנת 5 (אוחזים כעת ב12!!). לתשומת לבכם בהתקנת השרת הבאה שלכם. לגירסה 12 יש המון פיצ'רים שאין ב5.

                                          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                          בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                          nigunN תגובה 1 תגובה אחרונה
                                          5

                                          • 1
                                          • 2
                                          • 3
                                          בא תתחבר לדף היומי!
                                          • התחברות

                                          • אין לך חשבון עדיין? הרשמה

                                          • התחברו או הירשמו כדי לחפש.
                                          • פוסט ראשון
                                            פוסט אחרון
                                          0
                                          • דף הבית
                                          • קטגוריות
                                          • פוסטים אחרונים
                                          • משתמשים
                                          • חיפוש
                                          • חוקי הפורום