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

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



  #7  
ישן 03-05-2010, 05:21
  שימיadmin שימי אינו מחובר  
מנהל פורומי "תכנות ובניית אתרים" ו"חומרה ורשתות"
 
חבר מתאריך: 25.10.01
הודעות: 42,775
בתגובה להודעה מספר 6 שנכתבה על ידי sniper2 שמתחילה ב "אני חושב שאתה טועה,"

COUNT (וגם SQL_CALC) לא אמורות לשלוף את כל הנתונים ולא אמרתי שהן שולפות. הן כן עוברות על אותו dataset פעמיים כדי להשיג את התוצאות שלהן - כאשר בפעם השנייה יש סיכוי לא רע (אך לא מחייב) שהמידע כבר ב cache ולכן אולי תרגיש את זה פחות.

אבל אם נעבור כרגע על תכנות באופן כללי, מה עדיף:

* לעשות לולאת for שרצה על מערך בן 5000 ערכים, ועבור כל ערך שערכו משהו, מעלה מונה ב 1; ואז לעשות לולאה נוספת, זהה, שרצה על אותו מערך בין 5000 ערכים, ועבור כל ערך שערכו משהו, להדפיס את המשהו

או:

* לעשות לולאת for שרצה על מערך בן 5000 ערכים, ועבור כל ערך שערכו משהו, להעלות מונה ב 1, ולהדפיס אותו?

עכשיו תסבך את השאלה עם "ערך שערכו משהו" - ותוסיף לכל אחד מהמקרים שהלולאה שלך רצה, שהיא גם צריכה לעשות מיון, קיבוץ, השוואה של מספר ערכים, וכו', לפני ההדפסה [כך שחייבים ממילא לעשות את המיון כדי להחליט את מה להדפיס] - ותגיד לי מה נראה יותר הגיוני שמהיר יותר לעשות...
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה
נמאס לכם לזכור סיסמאות? לחצו כאן!

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #8  
ישן 02-05-2010, 14:38
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 1 שנכתבה על ידי DHT20 שמתחילה ב "לעשות שאילתה על שאילתה קודמת"

כדאי להוסיף לשאילתא את פסקת ה-LIMIT, ולאחר מכן לספור את סה"כ הרשומות בעזרת אינדקס ופונקציית COUNT, לדוגמא:

קוד:
/* Fetch the rows */ SELECT * FROM `comments_form` WHERE topic_id=@topic_id ORDER BY `id` DESC LIMIT @offset, @rows_cnt /* Count the rows, using an index (inspect the query plan) */ SELECT COUNT(*) AS `topic_rows_cnt` FROM `comments_form` WHERE topic_id=@topic_id

(המילים שיש להם קידומת "@" הם משתני SQL, במקומם תצטרך לשים מספר)
זה בהנחה שיש אינדקס על הטורים (`topic_id`, `id`), לפי הסדר.
כדאי גם שתבדוק את ה-query plan בעזרת הוספת קידומת "EXPLAIN" לשאילתא המקורית. אם עבור השאילתות כתוב בטור Extra את המילים "Using Index" אז זה בסדר.

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

אגב, שים לב שזה פורום SQL ולא PHP (תראה כאן הסבר מפורט)

נערך לאחרונה ע"י dorM בתאריך 02-05-2010 בשעה 14:40.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #11  
ישן 03-05-2010, 05:17
  שימיadmin שימי אינו מחובר  
מנהל פורומי "תכנות ובניית אתרים" ו"חומרה ורשתות"
 
חבר מתאריך: 25.10.01
הודעות: 42,775
בתגובה להודעה מספר 10 שנכתבה על ידי dorM שמתחילה ב "למה לא...? אאל"ט..."

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

תחשוב על זה - אם אתה היית מממש את הפונ' הנ"ל, מה בעצם היא הייתה עושה אם היא נכתבה נכון (ואנחנו צריכים להניח שהם לא סתם הוסיפו פונ' כזו אלא אם כן היא באמת משפרת כמו שהם אומרים במדריך עצמו שנתתי לינק אליו) ? סביר שהיא הייתה עושה בדיוק מה ששתי השאילתות שלך עושות, רק שהיא הייתה עושה זאת בריצה אחת - כאשר היא מספקת מידע לקליינט לפי הגבול שהתבקש, ואז ממשיכה הלאה לספור. שים לב שבדוגמא שצרפת יש שאילתא גם מאוד מאוד בנאלית; לרוב, שאילתות (ובפרט, שאילתות "דפדפוף", שבגללן משתמשים בפונ' הזו) - הן לא כאלה. יש JOIN-ים, יש GROUP BY-ים, יש WHERE-ים... בשאילתות כאלה בכל מקרה חייבים לעבור תמיד על כל הרשומות (כי אתה עושה ORDER BY וסינון, וחייבים לעבור בעצם על כל הרשומות [או האינדקס במקרה שאתה מיועל] כדי לספק ספירה נכונה ל COUNT) - ואז זה לא משנה ממש אם אתה עושה את זה עם SQL_CALC_FOUND_ROWS או אם שאילתא נוספת, למעט ה overhead הנוסף של שאילתא נוספת, "טחינה" חוזרת של ה cache (שבינתיים יכל גם להתנקות או שהטבלה יכלה להשתנות ואז צריך לעבור מחדש...) - ולכן, לסיכום, זה פשוט לא סביר שב USE CASE אמיתי, כזה שבו שתי השאילתות הן זהות, רק שבאחת יש LIMIT ובשנייה אין, ובייחוד בשאילתות "מסובכות", ש SQL_CALC_FOUND_ROWS לא יהיה מהיר יותר...

אבל אם בדקת ובמקרה שלך שתי השאילתות הזהות, ה COUNT עובד יותר מהר... (ואין לך בעייה באינדקסים)... אז וואלה, לך על זה, ונשמע שמצאת וואחד באג.
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה
נמאס לכם לזכור סיסמאות? לחצו כאן!

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #20  
ישן 04-05-2010, 00:01
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 19 שנכתבה על ידי שימי שמתחילה ב "עזוב, בדוק על כל test case..."

ציטוט:
במקור נכתב על ידי שימי
ואל תשכח: שלא יהיה שום הבדל בין השאילתא עם ה LIMIT לבין השאילתא עם ה SQL_CALC. שההבדל היחיד בין שתי שורות השאילתא יהיה ה SQL_CALC - לא בייט אחד פחות ולא בייט אחד יותר.

אני מניח שהתכוונת "שלא יהיה הבדל ... חוץ מ- SQL_CALC ו-LIMIT", כיוון שחובה להסיר את LIMIT כשסופרים את סה"כ הרשומות בשיטה עם ה-COUNT.

אוקי אז יצרתי קובץ עם שאילתות וביקשתי מ-MySQL להריץ אותו ולהכניס את התוצאות לקובץ טקסט.
השתמשתי בטבלה payment שבמסד הנתונים sakila המסופק באתר של MySQL. (אשמח לנסות על טבלה במסד נתונים אחר מהמבחר שלהם אם אתה מכיר משהו שיהיה מתאים יותר).
בחרתי את payment כי מספר הרשומות בו הוא הגדול ביותר מכל שאר הטבלאות במסד sakila.

count_vs_sql_calc.sql, count_vs_sql_calc.txt

התוצאות במבחן הראשון, שבו ה-offset של ה-LIMIT היה 0, מראות בבירור שהשיטה של COUNT מהירה יותר.
התוצאות במבחן השני, שבו ה-offset כמעט מקסימאלי, מראות ששתי השיטות רצות בזמנים דומים\שווים. אני מסיק מכך ש-SQL_CALC גורם לשאילתא לייצר את ה- result set ולאחר מכן לזרוק את כל מה שהוא לא צריך, מה שקורה בדיוק עם LIMIT כשה-offset גדול. השאילתא שסופרת את הרשומות מראה זמן ביצוע של 0.00 שניות, כנראה בגלל שהאינדקס קטן ולוקח ממש מעט זמן לעבור דרכו.

יכול להיות שאעשה בדיקה דומה עם פסקת ORDER BY, אני פשוט צריך למצוא איזו טבלה טובה עם הרבה רשומות...
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #21  
ישן 04-05-2010, 05:15
  שימיadmin שימי אינו מחובר  
מנהל פורומי "תכנות ובניית אתרים" ו"חומרה ורשתות"
 
חבר מתאריך: 25.10.01
הודעות: 42,775
בתגובה להודעה מספר 20 שנכתבה על ידי dorM שמתחילה ב "[QUOTE=שימי]ואל תשכח: שלא..."

או שפשוט תייצר אחת כזו

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

ואם תצליח להוכיח שגם במקרה שבו יותר הגיוני שמשתמשים בזה - זה גם איטי יותר, אני בהחלט אשקול לעשות שני דברים:

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

2. לפנות גם לחבר'ה של WordPress, שיעיפו את:
קוד:
if ( !empty($limits) ) $found_rows = 'SQL_CALC_FOUND_ROWS'; $this->request = " SELECT $found_rows $distinct $fields FROM $wpdb->posts $join WHERE 1=1 $where $groupby $orderby $limits";


מ query.php שלהם :|
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה
נמאס לכם לזכור סיסמאות? לחצו כאן!

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #22  
ישן 04-05-2010, 15:36
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 21 שנכתבה על ידי שימי שמתחילה ב "או שפשוט תייצר אחת כזו..."

אם אייצר אחת כזו זה לא יהיה אותנטי (המידע יוצר באופן שרירותי), אני לא אוהב להסתמך על זה.
הורדתי מסד נתונים ענק מ- https://launchpad.net/test-db/ שנקרא employees.
בהתחלה עשיתי ניסויים על הטבלה salaries כיוון שיש בה 2.8 מיליון רשומות. הבעיה בטבלה הזו היא ייחודיות הערכים בטורים (cardinality) שהייתה נמוכה מאוד (ולפיכך אם היינו רוצים לשלוף לדוגמא 20 רשומות, אז היה לנו עמוד אחד). זה לא טוב ולא מראה את התוצאות המתבקשות, אבל בכל זאת בדקתי באמצעות הטבלה הזאת.
תוצאות שהתקבלו באמצעות בדיקות על הטבלה salaries:
CvS.html, CvS.sql.

אחרי זה השתמשתי בטבלה dept_emp שה-cardinality בה היה גבוה מאוד (ניתן לראות זאת בקובץ התוצאות).
עשיתי ארבעה בדיקות: עבור offset נמוך, עבור offset גבוה, בדיקות ל-COUNT עם offset גבוה ואופטימיזציה מעטה, בדיקות ל-COUNT עם offset גבוה ואופטימיזציה מירבית.
SQL_CALC התברר כיעיל מול COUNT אך ורק במקרים שבהם: ה-offset גבוה ול-COUNT אין אופטימיזציה, ושה-offset גבוה ו-COUNT קיבל אופטימיזציה מעטה.
בשאר המקרים, COUNT גובר עליו משמעותית, במיוחד במקרה האופטימיזציה המירבית.
התוצאות (זמין בפורמט html ו-txt):

CvS_Real.txt
CvS_Real.html
CvS_Real.sql

אשמח לקבל תיקונים אם משהו שם בוצע לא נכון \ לא שמתי לב למשהו
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #23  
ישן 04-05-2010, 18:06
  שימיadmin שימי אינו מחובר  
מנהל פורומי "תכנות ובניית אתרים" ו"חומרה ורשתות"
 
חבר מתאריך: 25.10.01
הודעות: 42,775
בתגובה להודעה מספר 22 שנכתבה על ידי dorM שמתחילה ב "אם אייצר אחת כזו זה לא יהיה..."

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

בדוגמא השנייה - אני שם לב שהחיפוש מתבצע על טור טקסטואלי. יש סיבה שהוא לא אינדקס FULLTEXT ולא נעשה חיפוש FULLTEXT ?

ולבסוף, שמתי לב שמסדי הנתונים הם מסוג InnoDB, בעוד שרוב התעשיה משתמשת לרוב ב MyISAM (ה"בוגר" בכמה שנים טובות יחסית ל InnoDB), וב InnoDB משתמשים רק לפעמים לסוגי טבלאות מאוד מסויימים (UPDATE-ים בכמויות לתאים בודדים ורצון לא לנעול את כל הטבלה בזמן שהם מתרחשים). יש סיבה מיוחדת?
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה
נמאס לכם לזכור סיסמאות? לחצו כאן!

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
האשכול נעול

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

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

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

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



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

הדף נוצר ב 0.08 שניות עם 10 שאילתות

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

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