![ישן](https://static.fresh.co.il/images/vBulletin/statusicon/post_old.gif)
21-08-2008, 13:56
|
מנהל
|
|
חבר מתאריך: 26.07.08
הודעות: 6,473
|
|
ציטוט:
במקור נכתב על ידי ישראל K
במקרים רבים, טבלה קרטזית תהיה עדיפה, כיון שחסכון בזמן גישה נוסף למסד נתונים, בד"כ משמעותי יותר מאשר נפח התוצאה, במיוחד כשמדובר באי אלו רשומות בודדות ולא בכמה מאות קילו בתים של נתונים.
|
עשיתי בדיקה benchmark ואכן צדקת - עם INNER JOIN זה מהיר יותר במאית שניה (ב-0.001 מהיר יותר).
אבל כאן מגיעה אלי בעיה חדשה:
אני צריך לשלב איכשהו ב-WHERE, שבמידה ולא מצאתי בטבלה tbl1 את ה-id שדרוש לי, אז זה יבחר רשומה ע"פ קריטריונים אחרים (ע"פ 2 שדות אחרים).
בדרך שעשיתי (לא בדרך של INNER JOIN), כתבתי את זה בצורה הבאה:
קוד:
WHERE (tbl1.id=123 OR ( col_foo=456 AND col_bar=789 ) ) AND active_row=1
המספרים הנ"ל שבחרתי הם שרירותיים.
אם אכתוב את פיסקת ה-WHERE שלמעלה כאשר אני משתמש ב-INNER JOIN, זה יסבך לי את התוצאה שאקבל מהשאילתא, כפי שגם צפוי לקרות.
אני משתמש ב-col_foo ו-col_bar כדי למצוא רשומה אחרת, במידה ולא מצאתי את הרשומה ע"פ ה-id שנתון לי (שבמקרה הזה הוא 123).
את ה-active_row אני חייב שיהיה שווה ל-1 בכל מקרה שבו אני מקבל מידע\רשומה מהטבלה tbl1, כדי שאקבל רשומה שהיא נחשבת פעילה. לכן אני צריך אותו בשני המצבים הנ"ל.
לכן השאלה היא האם זה משתלם להשתמש ב-INNER JOIN, בגלל הבעיות החדשות שמופיעות, שכנראה בגללם אצטרך להריץ שאילתא חדשה וניפרדת כדי לקבל רשומה מהטבלה tbl1 ?
יש לציין שיש עוד מצב אחד אחרון - שבו אני בוחר רנדומלית (בעזרת ORDER BY RAND) רשומה מהטבלה tbl1 שהיא פעילה ( שיש לה active_row=1 ), במידה ולא קיבלתי רשומה בתנאי של col_foo ו-col_bar.
המצב הזה סיבך אותי עוד קצת יותר ולכן נכון לעכשיו הוא מורץ בשאילתא נפרדת (במידה והשאילתא הראשונה לא החזירה שום רשומה).
נערך לאחרונה ע"י dorM בתאריך 21-08-2008 בשעה 13:59.
|