לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #2  
ישן 25-12-2005, 13:03
  AlexKarpman AlexKarpman אינו מחובר  
 
חבר מתאריך: 20.12.01
הודעות: 20,962
ובכן, דקל מתבייש להגיב, אז נגיב במקומו :)
בתגובה להודעה מספר 1 שנכתבה על ידי AlexKarpman שמתחילה ב "קבלת ערכים ייחודיים של שדה - DISTINICT או GROUP BY?"

הוא אימת את זה ש-DISTINICT עדיף, גם אם רק ב-mysql הזה שלו...
הנה תוצאות ה"מסבירן" של mysql(הידוע גם בשמו EXPLAIN) לגבי שתי שאילתות דומות. הראשונה עם
DISTINCT והשני עם GROUP BY:
קוד:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra 1 | SIMPLE | session | ALL | NULL | NULL | NULL | NULL | 3544 | Using temporary 1 | SIMPLE | session | ALL | NULL | NULL | NULL | NULL | 3544 | Using temporary; Using filesort

הן כמעט זהות, חוץ מזה שה-GROUP BY מסבך את העניינים. מה זה בכלל Using filesort ומי צריך את זה?

לפי הבנתנו זה קשור לכך ש-DISTINCT לוקח ערכים ייחודיים, וזה כל מה שהוא עושה, בעוד ש-GROUP BY
"מקבץ" אותם, ומכין אותם לשימוש בפונקציות צבירה, מה שכנראה(ד'ה) מסבך את כל העסק.

כרגע, נראה כאילו יש להשתמש ב-DISTINCT בלבד כדי לקבל ערכים ייחודיים(בלי להתייחס לאופטימיזציות שמסד
נתונים זה או אחר יכול לעשות על השאילתה)


קדימה, דקל. תיקונים.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #5  
ישן 26-12-2005, 16:29
  GreenBerret GreenBerret אינו מחובר  
 
חבר מתאריך: 13.12.05
הודעות: 1,963
בתגובה להודעה מספר 4 שנכתבה על ידי AlexKarpman שמתחילה ב "מצטער, לא הבנתי."

תרגום חופשי לציטוט שלי:
אם תשתמש בקבץ לפי, התוצאה שלך תהיה מסודרת לפי הטורים שבחרת לקבץ, כאילו שהיית עושה סדר לפי לאותם טורים.

^ מה שמסביר את תופעת ה"סידור" שלך.

וציטוט מהמאמר שהבאתי:


ציטוט:
Where is the logical flaw? As stated above, this is a typical query in which all the data comes from a single table: CUSTOMERS. Interestingly, it returns a CUSTOMER_ID. There's no prize for guessing that this is likely to be the primary key, uniquely identifying each row in CUSTOMERS. However, we need a DISTINCT; one customer may have ordered several times in the period of interest. In other words, we are fixing with DISTINCT a problem of our own design.

This is a "Penelope" type of query. Penelope, as told in Homer's Odyssey, was the wife of Ulysses, king of Ithaca. Hoping for the return of her husband from Troy, she kept suitors at bay by pretending that she would consider them once she completed her weaving--which she kept going by undoing at night what she had done during the day.

Like Penelope, we are doing a lot of work by executing a regular join and bringing back many rows, only to undo a large part of it in order to retrieve the resulting set. (The "best" examples of Penelope queries are usually met with queries involving complex views, however.)



שבגדול, מה שזה אומר:
"אנחנו לוקחים את כל השדות, רק כדי לסנן את הכפולים לבסוף".

ליתר דיוק, הפעולה DISTINCT היא פעולה "ערבית".
היא לוקחת את כל השדות שמתאימות לשאילתא שלך, ורק לאחר מכן מסננת את הכפילויות.
אומנם אתה מריץ query אחד ומקבל תוצאה אחת, אבל זה כאילו הרצת שתיים (או אחד וחצי?).

הפתרון שמוצע שם משתמש בsubqueries כדי לקבל בquery אחד את התוצאות הדרושות.
אבל, ויש אבל, תכנון נכון של מסד הנתונים לא יגרור שימוש בDISTINCT.

כמו שאתה יכול לקרוא כאן יש הסבר, וגם תוצאות של זמן ריצה שמסביר בדיוק את מה שאמרתי.

אם אני טועה, אתה מוזמן לתקן. יכול להיות שיש לי בעיה בהבנת הנקרא איפה שהוא

נערך לאחרונה ע"י GreenBerret בתאריך 26-12-2005 בשעה 16:36.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #6  
ישן 26-12-2005, 17:21
  AlexKarpman AlexKarpman אינו מחובר  
 
חבר מתאריך: 20.12.01
הודעות: 20,962
ונראה לך שזה בא ב"חינם"?
בתגובה להודעה מספר 5 שנכתבה על ידי GreenBerret שמתחילה ב "תרגום חופשי לציטוט שלי: אם..."

ה-EXPLAIN של mysql(כן, כן. אותו mysql שאת התיעוד הפרטי שלו הבאת) טוען
ש-GROUP BY "מסובך" יותר. "תופעת הסידור" הזו לא באה בחינם. כדי לסדר מידע
יש לבצע עיבוד. עיבוד המידע לוקח זמן. איך קבעת שזמן רב יותר = יעילות גדולה יותר
אין לי מושג. לא שאלתי למה יש פונקציונאליות גדולה יותר, אלא מה יעיל יותר במקרה
המדובר.

את המאמר קראתי, והציטוט שלו שוב ושוב לא ישנה דבר. המאמר מדבר על מקרה
בו ה-DISTINCT נועד לצמצם רשומות כפולות שנוצרו משימוש שגוי ב-FROM או חוסר
שימוש ב-WHERE. לא דובר על DISTINCT מול GROUP BY, שזו הייתה השאלה.

ועכשיו אחזיר אותך לשאלה המקורית:
ציטוט:
במקור נכתב על ידי AlexKarpman
לשם הפשטות, נניח שיש לי טבלה כזו:
קוד:
rank | name 1 | abdalla 2 | yusuf 3 | muhammad 1 | yassir 2 | said 3 | rashid 1 | ahmed

ואני רוצה לקבל טבלה(/תצוגה?) בעלת שדה אחד(שוב למען הפשטות), כאשר תהיה
שורה אחת עבור כל ערך ייחודי שלו בטבלה, כך:

קוד:
rank 1 2 3


אני מת לראות איך אתה עושה את זה בעזרת תת-שאילתות(איזה תת-שאילתות?
מדובר על טבלה אחת בלבד, שממנה אנו רוצים לקבל עמודה אחת בלבד, בלי שום
קריטריונים נוספים מלבד ייחודיות), או בעזרת "שימוש נכון ב-FROM", או בעזרת
פסוקית WHERE...
באמת שאני רוצה לדעת כיצד זה אפשרי(ואם כן, מה הביצועים של זה מול DISTINCT).
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #8  
ישן 26-12-2005, 17:53
  AlexKarpman AlexKarpman אינו מחובר  
 
חבר מתאריך: 20.12.01
הודעות: 20,962
עכשיו הבנתי אותך.
בתגובה להודעה מספר 7 שנכתבה על ידי GreenBerret שמתחילה ב "משום מה קיבלת את הרושם שאני..."

אבל אתה עדיין לא הבנת אותי

לא פתחתי אשכול על DISTINCT, ולכן אינני רואה כל טעם ב"עיסוק בכל האספקטים
שלו". אני רק שאלתי כיצד עדיף להשיג רשימה של ערכים ייחודיים משדה מסויים. בזה
עוסק האשכול. זו הייתה השאלה שלי.
אולי בין:
קוד:
SELECT DISTINCT field FROM table ORDER BY field

לבין:
קוד:
SELECT field FROM table GROUP BY field

היה הבדל. אתה מוזמן לבדוק מה עדיף במקרה כזה, אבל אל תשכח שעניין המיון
ב-GROUP BY מיוחד ל-mysql ולא נדרש ע"י התקן(לפחות, לא שאני יודע על זה;
אתה מוזמן לתקן), ככה שזה רחוק מלהיות עקרוני או משמעותי.

ולגבי DISTINCT באופן כללי. אין בו שום דבר רע. יש רע בשימוש בו כשאינו נחוץ,
כמו בכל אופציה אחרת של השפה(או של כל שפה אחרת, לעצם העניין).
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 19:56

הדף נוצר ב 0.06 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר