פורום קידום אתרים
+ הגב לאשכול זה
מציג תוצאות 1 עד 14 מתוך סך הכל של 14

אשכול: האם מישהו מכיר תחליף לפונקציה sum() ?

  1. #1
    מכור לפורום TopGun(Alka) אינו מוערך במערכת הפורומים הסמל האישי שלTopGun(Alka)
    תאריך הצטרפות
    Feb 2006
    מיקום
    אור עקיבא
    הודעות
    4,037

    האם מישהו מכיר תחליף לפונקציה sum() ?

    מדובר בפונקציה של SQL בבסיס הנתונים של mysql.

    יש לי טבלה שהשורות שם רק גודלות ולאט לאט הפונקציה SUM() מתחילה להחנק ולוקח לה הרבה זמן להחזיר תשובה.

    כשיש 60K או 100K שורות היא עוד חיה אבל עכשיו יש 600K וזה רק גודל הפונקציה SUM מתחילה להחנק.

    מישהו מכיר דרך אחרת לאותה פעולה ?
    תודה.
    אלמיר מערכות תוכנה,
    העוסקת בשירותי בניית אתרים באינטרנט איכותיים ברמת גימור גבוהה לכלל המגזרים.
    לפרטים נוספים 04-63-63-281

  2. #2
    משתמש כבד rs324 אינו מוערך במערכת הפורומים
    תאריך הצטרפות
    Nov 2006
    הודעות
    565
    מה אתה מנסה לעשות ?
    שים לב גם כמה שדות אתה מושך בשאילתא לדוגמא
    אם אתה עושה :
    SELECT tableid , SUM(countfield)AS total FROM mytable
    יהיה הרבה יותר קליל מ
    SELECT tableid ,title,field1,field2, SUM(countfield)AS total FROM mytable

    תבחר כמה שפחות מהמסד
    באופן כללי אני לא יודע למה אתה צריך שיהיה לך 600 K שורות במסד
    אתה יכול לעשות סיכומים ולהעביר אותם לטבלה נפרדת (נניח סיכום חודשי או משהו) ואז לסכם את הטבלה הנפרדת...

    באופן כללי 2 :
    אתה תמיד יכול להקצות יותר זיכרון ל MYSQL ויש הרבה הגדרות ב CONFIG שיכולות שיודעות להתעסק בדיוק עם הגבלות והגדרות זיכרון לפעולות שונות של ה MYSQL

    באופן כללי 3 :
    מה הסוג הארדיסקים שיש לך על השרת ? האם יש לך שרת ייעודי רק ל MYSQL ? מה ה LOADS שהMYSQL נותן ? תבדוק LOGS עבור שאליתות איטיות ותראה מה יוצא ,
    מה הסוג טבלה ? MYISAM או INNODB ?
    השדה שאתה עושה עליו SUM מוגדר כאינדקס ?
    בכלליות 600 אלף שורות זה לא כזה הרבה
    אבל יכול להיות שפשוט הלוגיקה שלך לא נכונה , השרת לא מתאים ועוד המון סיבות

  3. #3
    מכור לפורום TopGun(Alka) אינו מוערך במערכת הפורומים הסמל האישי שלTopGun(Alka)
    תאריך הצטרפות
    Feb 2006
    מיקום
    אור עקיבא
    הודעות
    4,037
    1.
    מדובר בשרת לא פרטי, שיתופי.

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

    3.
    אני לא לוקח שדות נוספות, רק משתמש ב sum() בלבד.

    4.
    תודה.
    אלמיר מערכות תוכנה,
    העוסקת בשירותי בניית אתרים באינטרנט איכותיים ברמת גימור גבוהה לכלל המגזרים.
    לפרטים נוספים 04-63-63-281

  4. #4
    משתמש כבד rs324 אינו מוערך במערכת הפורומים
    תאריך הצטרפות
    Nov 2006
    הודעות
    565
    מה הסוג של השדה ? INT ?
    דבר ראשון תגדיר את השדה הזה כאינדקס (לא PRIMERY KEY אבל כ INDEX)

    מה הסוג של הטבלה ? MYISAM ? INNODB ?

    תדביק פה את ה CONFIG של ה MYSQL (בד"כ נמצא ב /etc/my.cnf)

    בנוסף תן את הפרטים של השרת (מעבד \ זיכרון)

  5. #5
    מכור לפורום TopGun(Alka) אינו מוערך במערכת הפורומים הסמל האישי שלTopGun(Alka)
    תאריך הצטרפות
    Feb 2006
    מיקום
    אור עקיבא
    הודעות
    4,037
    א.
    שדה מסוג VARCHAR כי אני שומר שם מספרים בצורה 25.36

    ב.
    טבלה מסוג MyISAM

    ג.
    זה לא שרת שלי, שיתופי.
    אלמיר מערכות תוכנה,
    העוסקת בשירותי בניית אתרים באינטרנט איכותיים ברמת גימור גבוהה לכלל המגזרים.
    לפרטים נוספים 04-63-63-281

  6. #6
    משתמש כבד rs324 אינו מוערך במערכת הפורומים
    תאריך הצטרפות
    Nov 2006
    הודעות
    565
    דבר ראשון אם יצרת אינדקס כמו שאמרתי לך , אז תמחק אותו

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

    דבר שלישי שאתה צריך לעשות זה ליצור את האינדקס (אחרי שהחלפת את ה type של השדה)

    דבר רביעי תעשה : תיקון ואחרי זה ייעול לכל הטבלה

    אחרי שסיימת לעשות את כל זה אתה אמור להרגיש הבדל

    אם אתה לא מרגיש הבדל משמעותי זה להכנס יותר להגדרות של השרת (הקצאת יותר זיכרון לפעולות עיבוד מסויימות וכד')

    נ.ב
    בד"כ המסד innodb יותר יעיל ומהיר מ myisam (לפחות לפי בדיקות שראיתי המון פעמים) תשקול לשנות את הסוג של הטבלה ל innodb

    בכל מקרה אל תשכח לגבות
    ותעדכן בהתפתחות..

  7. #7
    מכור לפורום TopGun(Alka) אינו מוערך במערכת הפורומים הסמל האישי שלTopGun(Alka)
    תאריך הצטרפות
    Feb 2006
    מיקום
    אור עקיבא
    הודעות
    4,037
    האמת, לא מרגיש שינוי.
    אולי במקום 8 שניות נהיה 7 שניות, אך זה קריטי.

    ה SELECT שלי נראה ככה

    SELECT COALESCE( SUM( asm_watching.w_price) , 0 ) AS `totalpay`
    אלמיר מערכות תוכנה,
    העוסקת בשירותי בניית אתרים באינטרנט איכותיים ברמת גימור גבוהה לכלל המגזרים.
    לפרטים נוספים 04-63-63-281

  8. #8
    משתמש כבד rs324 אינו מוערך במערכת הפורומים
    תאריך הצטרפות
    Nov 2006
    הודעות
    565
    בשביל מה אתה משתמש בפונקצייה coalesce ? אחרי שהחלפת ל float מה שאין לו ערך (ערך null) הופך להיות 0 ואז אתה לא צריך אותה בשביל לסנן את הערכים של ה null (ואם אתה מאפשר null אז אל תאפשר ותשים defualt value = 0 על השדה בטבלה)

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

    אם אתה מעוניין להמשיך להשאר על שרת שיתופי תצטרך לשנות את השיטת עבודה שלך ולעשות סיכומים (אני לא יודע איך המבנה של המסד שלך אבל נניח תעשה טבלאת סיכום לחודשים וכל חודש זה שורה חדשה במסד עם ה sum של אותו החודש)

  9. #9
    מנהלי פורומים דקל אינו מוערך במערכת הפורומים
    תאריך הצטרפות
    Jul 2005
    הודעות
    1,051
    ציטוט פורסם במקור על ידי TopGun(Alka) צפה בהודעה
    האמת, לא מרגיש שינוי.
    אולי במקום 8 שניות נהיה 7 שניות, אך זה קריטי.

    ה SELECT שלי נראה ככה

    SELECT COALESCE( SUM( asm_watching.w_price) , 0 ) AS `totalpay`
    אם תוכל לתת עוד קצת הסברים, נוכל אולי לזרוק עוד קצת רעיונות שיוכלו לעזור לך.
    מה המטרה של הטבלה asm_watching? כמה שדות יש בה? מה אומרים השדות?
    כל כמה זמן נכנסים לשם נתונים? כל כמה זמן אתה שולף משם נתונים? האם יש פונקציות נוספות שאתה משתמש בהן באופן קבוע מול הטבלה הזאת?

    בנוגע להבדלי הביצועים של MyISAM מול InnoDB - ההבדלים תלויים באופי השימוש. לכל מטרה מיועד מנוע אחר.

    סתם לצורך העניין, יצרתי עכשיו 2 טבלאות (משני הסוגים) המכילות מיליון רשומות (זהות) כל אחת, כאשר ב-2 הטבלאות יש (בין השאר) 2 עמודות מסוג float, אשר עמודה אחת מאונדקסת ועמודה אחת לא.
    הרצתי sum על העמודות השונות, והנה התוצאות שקיבלתי:
    1. MyISAM
      1. עמודה מאונדקסת - 0.41 שניות
      2. עמודה לא מאונדקסת - 0.11 שניות
    2. InnoDB
      1. עמודה מאונדקסת - 9.4 שניות
      2. עמודה לא מאונדקסת - 0.10 שניות
    שים לב שבשני המנועים, דווקא העמודות שאינן מאונדקסות נותנות תוצאה טובה יותר (מבחינת הצרכים שלך).
    אינדקס לרוב לא מיועד למטרת פעולות מתמטיות, אלא יותר למטרת ביצוע חיפושים. במקרה של פעולות מתמטיות על רשומות מאונדקסות, האינדקס יוצר "עומס" מיותר על הדטאבייס בגישה לנתונים, ולכן יפגע בביצועים של השאילתא.

    מקווה שזה עוזר לך, קצת.
    אם עדיין יש בעיה - תציץ בתחילת התגובה שלי

    דקל
    "מתכנת זה אדם שפותר בעיה שעל קיומה לא ידעת, בדרך שאינך מבין"

  10. #10
    משתמש כבד rs324 אינו מוערך במערכת הפורומים
    תאריך הצטרפות
    Nov 2006
    הודעות
    565
    כל הכבוד דקל אני יודע שבד"כ אינדקס יוצר עומס על הכנסת נתונים ולא על פעולות מתמטיות
    אבל כל הכבוד שהרמת את הכפפה והלכת לעשות קצת testing

  11. #11
    מכור לפורום TopGun(Alka) אינו מוערך במערכת הפורומים הסמל האישי שלTopGun(Alka)
    תאריך הצטרפות
    Feb 2006
    מיקום
    אור עקיבא
    הודעות
    4,037
    תודה על העזרה.
    לא החלטתי מה לעשות בנתיים.
    אלמיר מערכות תוכנה,
    העוסקת בשירותי בניית אתרים באינטרנט איכותיים ברמת גימור גבוהה לכלל המגזרים.
    לפרטים נוספים 04-63-63-281

  12. #12
    מנהלי פורומים דקל אינו מוערך במערכת הפורומים
    תאריך הצטרפות
    Jul 2005
    הודעות
    1,051
    ציטוט פורסם במקור על ידי rs324 צפה בהודעה
    כל הכבוד דקל אני יודע שבד"כ אינדקס יוצר עומס על הכנסת נתונים ולא על פעולות מתמטיות
    אבל כל הכבוד שהרמת את הכפפה והלכת לעשות קצת testing
    בסופו של דבר בלי לבדוק את הנתונים בפועל, בהתאם לצורך הנקודתי, יהיה קשה מאוד לדעת מה הדרך הטובה ביותר לבצע משהו.
    אם (נניח) היינו חייבים להוסיף אינדקס על העמודה המדוברת (לטובת שאילתות אחרות), הייתי ממליץ להשתמש במנוע MyISAM, מהסיבה הפשוטה שההבדל לא כזה מהותי (בכל מקרה מדובר בפחות משניה, כאשר ב-InnoDB למשל ההבדל מהותי הרבה יותר).
    מצד שני - לא תמיד זה אפשרי.

    אגב, סתם בשביל הקטע החלטתי לבדוק את מנוע הזיכרון, והוא נותן נתונים יפים בהרבה
    עבור מיליון רשומות לקח לשאילתא שלי 0.07 שניות לרוץ, בלי שום הבדל בין עמודה עם אינדקס ועמודה בלי.
    עבור 5 מיליון רשומות לקח לשאילתא שלי 0.4 שניות לרוץ, כן גם בלי הבדל בין עמודה עם אינדקס ובלי.

    דקל
    "מתכנת זה אדם שפותר בעיה שעל קיומה לא ידעת, בדרך שאינך מבין"

  13. #13
    משתמש כבד rs324 אינו מוערך במערכת הפורומים
    תאריך הצטרפות
    Nov 2006
    הודעות
    565
    בגלל שמנוע memory יושב באמת על הזיכרון וכידוע זה הרבה יותר מהיר מהארדיסק
    אני מאמין שעם הארדידסקים של ssd (flash memory התוצאות יהיו דיי דומות

    משום מה innodb עמודה מאונדקסת נשמע לי קצת הזוי 9 שניות אתה בטוח שלא היה לך איזה עומס במקרה באותו הרגע ?

  14. #14
    מנהלי פורומים דקל אינו מוערך במערכת הפורומים
    תאריך הצטרפות
    Jul 2005
    הודעות
    1,051
    ציטוט פורסם במקור על ידי rs324 צפה בהודעה
    משום מה innodb עמודה מאונדקסת נשמע לי קצת הזוי 9 שניות אתה בטוח שלא היה לך איזה עומס במקרה באותו הרגע ?
    כמובן.
    הבדיקות שעשיתי לא היו הרצה אחת וכתיבת הזמן שלקח, אלא מספר הרצות וחישוב ממוצע.
    ככה עושים בדיקות ביצועים

    דקל
    "מתכנת זה אדם שפותר בעיה שעל קיומה לא ידעת, בדרך שאינך מבין"

+ הגב לאשכול זה

חוקי משלוח הודעות

  • אין באפשרותך לפתוח נושאים חדשים
  • אין באפשרותך להגיב להודעה
  • אין באפשרותך לצרף קבצים
  • אין באפשרותך לערוך את ההודעות שלך