איך עושים JOIN?
-
@nigun אמר באיך עושים JOIN?:
מה ההבדל בין ...
לכאורה אין הבדל:
SELECT points.user, points.points FROM points JOIN info ON info.user=points.user
לבין (אם נוריד את ה TOP\LIMIT)
SELECT points.user, points.points FROM points JOIN userinfo ON points.user=userinfo.user;
אינני יודע, אך אולי ב MYSQL הסדר של ה ON משנה וצריך לרשום:
ON points.user=info.user
ולא
ON info.user=points.user
-
@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;
-
@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 אמר באיך עושים JOIN?:
מעניין מה ההבדל?
כתבתי למעלה, שמשום מה סדר הריצה של המסד נתונים שלך היה קודם כל לבצע JOIN (מה שיצר כנראה מליוני רשומות) ורק אח"כ סינון ב-WHERE.
תוסיף את העניין שמדובר ב-JOIN של מחרוזות שגם הוא איטי בהרבה מJOIN של מספרים - וקיבלת חצי שעה של תעסוקה למעבד...@dovid אמר באיך עושים JOIN?:
בדרך כלל המסד נתונים לבד בוחר לבצע סינון לפני הJOIN אם יש לו אינדיקציות ברורות שזה שווה.
אולי עדיף לא להשאיר את הדבר בידיים של הDB איפה שאפשר בקלות לקבוע את הסדר כדלעיל?
-
@OdedDvir אמר באיך עושים JOIN?:
אולי עדיף לא להשאיר את הדבר בידיים של הDB איפה שאפשר בקלות לקבוע את הסדר כדלעיל?
זה לגיטימי לעיתים נדירות, אחרת הרסת את כל הרעיון של SQL ("תגיד מה אתה רוצה, אני אדאג לאיך").
מקרה שבו הDB כ"כ מזייף הוא משונה מאוד. ב99% מהמקרים הDB חכם מספיק לעשות את הסדר הכי טוב. -
@dovid אמר באיך עושים JOIN?:
זה לגיטימי לעיתים נדירות, אחרת הרסת את כל הרעיון של SQL ("תגיד מה אתה רוצה, אני אדאג לאיך").
אני עדיין אוחז ב"תגיד מה אתה רוצה ועדיין תדאג"...
מקרה שבו הDB כ"כ מזייף הוא משונה מאוד. ב99% מהמקרים הDB חכם מספיק לעשות את הסדר הכי טוב.
מעניין לראות את תוכנית הריצה של השאילתא הארוכה. אם @nigun יוכל להראות אותה כאן (כמובן רק אם זה לא ידרוש שוב חצי שעה...)
-
@OdedDvir אמר באיך עושים JOIN?:
@dovid אמר באיך עושים JOIN?:
זה לגיטימי לעיתים נדירות, אחרת הרסת את כל הרעיון של SQL ("תגיד מה אתה רוצה, אני אדאג לאיך").
אני עדיין אוחז ב"תגיד מה אתה רוצה ועדיין תדאג"...
זה לא נורמלי, במקרים רגילים אמורים להיות רגועים לחלוטין.
מצב בו חושבים מה יותר יעיל בכל שאילתה אינו הגיוני כי SQL מסתיר המון מידע, פרטים פיזיים וטכניים שקריטיים לאיך לבצע את השאילתה. כל עוד הוא אחראי אתה סומך על ידיעותיו, אבל אם אתה נהיה "אחראי" למיטוב השאילתות, אתה מגשש באפילה עם סברות שלא תמיד בקנה אחד עם המצב הטכני של הנתונים. -
@dovid אמר באיך עושים JOIN?:
זה לא נורמלי, במקרים רגילים אמורים להיות רגועים לחלוטין.
אני משער שכך הוא בבסיסי נתונים מקצועיים.
לצערי אני מגיע משדה הקרב של Access, שם Jet לא מגיע לרמות של אופטימיזציה כזו, נוכחתי לדעת ששאילתא שלקחה לי למעלה מ-4 דקות עם הרבה Join-ים הפכה ל-3 שניות כשסידרתי אותה מחדש (עם טבלאות זמניות וכו').נו, עוד מסמר בארון של אקסס...
-
@dovid אמר באיך עושים JOIN?:
אתה מדבר על שאילות רציניות מאוד
נכון, היו שם לפחות 20 Join-ים של שאילתות שונות.
לפי זכרוני עיקר הבעיה שם הייתה שהייתה שאילתא מאוד בסיסית שעושה סינון על טבלה (כדי לשלוף רק את הנתונים הרלוונטיים למערכת) והרבה מהשאילתות הנ"ל התבססו עליה (כדי לחשב כל אחת את הדרוש לה) ואח"כ בוצע Join. זה גרם קריאות רבות לאותה שאילתא, והפתרון היה טבלת עזר זמנית.