none
חוסר עקביות בביצועים RRS feed

  • שאלה

  • אהלן.

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

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

    ניסיתי את הטריקים הידועים, כולל כאלו שעלו בשרשור שלי מפה בעבר - http://social.technet.microsoft.com/Forums/he-IL/150e6a23-2d45-47d2-8d8e-dad6e8529764/-?forum=sqlhe#c05762d5-04d2-4bee-bcc1-80bee92b21c9

    לצערי לא ממש עזר.

    בשאילתות בעיתיות אני מראש:

    1. SET ARITHABORT ON לפני הגדרת הפרוצדורה ובתוך הפרוצדורה עצמה
    2. SET NOCOUNT ON (בפרוצדורה)
    3. אני מכניס משתנים מסוג table type לתוך טבלאות זמניות

    זה בהתחלה נראה משפר, ואז שוב TIMEOUTs....

    ויש מקרים בהם יצירה מחדש של הפרוצדורה פותרת איטיות\TIMEOUT....

    למישהו יש רעיון? (או פסיכולוג טוב..... :-) )

    תודה, איתי.


    itaigitt, http://copypastenet.blogspot.com

    יום שני 28 אוקטובר 2013 11:47

תשובות

  • הי איתי,

    יצירה של פרוצדורה מחדש גוררת קומפילציה מחדש, וכאשר מתבצעת קומפילציה מחדש אתה יכול לקבל Execution Plan חדש ששונה מהקודם. זה בדרך כלל קורה בגלל Parameter Sniffing, מכיוון שבהרצה הבאה של הפרוצדורה נעשה שימוש בפרמטרים, אשר מובילים ל-Execution Plan החדש.

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

    בהצלחה!

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeira.co.il

    • הוצע כתשובה על-ידי Eran Sharvit יום ראשון 03 נובמבר 2013 14:19
    • סומן כתשובה על-ידי Eran Sharvit יום שני 04 נובמבר 2013 09:27
    יום חמישי 31 אוקטובר 2013 05:40
    מנחה דיון

כל התגובות

  • היי איתי,

    בתור התחלה אתה יכול לבדוק את הדברים הבאים:

    1.  לנקות את ה- CACHE לפני כל ריצה ואז לראות אם יש הבדל בזמני ריצה.

    2. להשוות את ה- EXECUTION PLAN של הפרוצדורה הבעייתית בכל אחת מהריצות (המהירה מול האיטית), ואז לקבל מושג אם משהו מתנהג באופן שונה.

    תומר.

    יום שני 28 אוקטובר 2013 14:47
  • הי איתי,

    אתה שואל שאלה מאוד כללית, וקצת קשה לענות עליה והגיע לפתרון.

    קח פרוצדורה אחת לדוגמא, פרסם כאן את הקוד שלה ואת ה-Execution Plans שלה, וננסה לנתח את המקרה ביחד.

    תודה!

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeira.co.il

    יום שלישי 29 אוקטובר 2013 06:12
    מנחה דיון
  • בנוסף למה שנכתב הייתי בודק את הסביבה הכללית של השרת. אתה מדבר על מקרים שלא הצלחת למצוא את הסיבתיות שלהם והבעיה מופיעה במה שנראה רנדומלי. זה צועק "סביבה". יכול להיות שתוכנית ההרצ המיטבית והשאילתה רצה עם אותה תוכנית ואותם פרמטרים אבל הסביבה שונה. יכול להיות שנוצרים נעילות בעקבות שאילתות ופעולות אחרות, יכול להיות שמשאבי המערכת הופנו בכלל לטובת אפליקציות שונות.

    אני מציע להתחיל בבדיקת תוכנית ההרצה שמופעלת בפועל, סטאטיסטיקה ו CASH כפי שכתב תומר (פשוט כי זה הכי מהיר) ולעבור לבדיקות של נעילות והמתנות (WAIT) שיש במערכת, מצב משאבי המערכת ובדיקת הסביבה בכלל בזמן שהשאילתה ניראית איטית.

    * למה אתה קובע SET ARITHABORT ON באופן קבוע? אני זוכר את השאלה שלך ואת ההמלצה שלנו לשים פרמטר זה אבל זה לא אומר שצריך לשנות את ברירת המחדל  תמיד. בעבר הבעיה שלך היתה שאילתה איטית באפליקציית דוט נט ומהירה ב SSMS ולכן הוצע לשנות הגדרות שהן שונות בין ה SSMS והדוט נט כמו SET ARITHABORT ON. אני לא אומר לא לשנות קבוע אלא רק מציע לבדוק ולא לפעול בצורה אוטומטית.

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


    [Personal Site] [Blog] [Facebook]signature

    • נערך על-ידי pituachMVP, Editor יום שלישי 29 אוקטובר 2013 09:58
    • הוצע כתשובה על-ידי Eran Sharvit יום ראשון 03 נובמבר 2013 14:19
    יום שלישי 29 אוקטובר 2013 09:58
    מנחה דיון
  • הי.

    נשמח לעדכון בסטטוס השאלה. אם אחת מן התשובות כאן עזרה לך - אנא סמן אותה.

    תודה.

    צוות הפורומים


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

    יום רביעי 30 אוקטובר 2013 09:51
  • היי.

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


    itaigitt, http://copypastenet.blogspot.com

    יום רביעי 30 אוקטובר 2013 09:55
  • עוד משהו שקורה אצלי:

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

    מה אני מפספס פה????


    itaigitt, http://copypastenet.blogspot.com

    יום רביעי 30 אוקטובר 2013 11:37
  • הי איתי,

    יצירה של פרוצדורה מחדש גוררת קומפילציה מחדש, וכאשר מתבצעת קומפילציה מחדש אתה יכול לקבל Execution Plan חדש ששונה מהקודם. זה בדרך כלל קורה בגלל Parameter Sniffing, מכיוון שבהרצה הבאה של הפרוצדורה נעשה שימוש בפרמטרים, אשר מובילים ל-Execution Plan החדש.

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

    בהצלחה!

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeira.co.il

    • הוצע כתשובה על-ידי Eran Sharvit יום ראשון 03 נובמבר 2013 14:19
    • סומן כתשובה על-ידי Eran Sharvit יום שני 04 נובמבר 2013 09:27
    יום חמישי 31 אוקטובר 2013 05:40
    מנחה דיון