none
IndexOutOfRangeException RRS feed

  • שאלה

  • שלום,

    מדי פעם מתקבלת ב- eventviewer הודעת שגיאה "index was outside the bounds of the array".

    במקביל מתקבלת הודעת שגיאה גם אצל משתמש הקצה.

    ב- Error Log של SQL לא מתקבלת אף הודעת שגיאה.

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

    מדובר בגרסת SQL Server 2008 R2.

    האם למישהו יש רעיון מה יכול להיות הגורם לבעיה?

    תודה רבה מראש,

    מיכל

    יום ראשון 29 ספטמבר 2013 13:36

תשובות

  • שלום,

    זה המאמר הרשמי שמתאר את הבעיה והפתרונות האפשריים  בכל המצבים האפשריים
    http://support.microsoft.com/kb/2280390
    זה בעקרון באג ב .net framework  שיכול כפי שתיאר רונן להשפיע גם על האפליקציה וגם על SSMS 

    מקווה שעזרתי,
    נועם

     
    • סומן כתשובה על-ידי michal12 יום רביעי 02 אוקטובר 2013 10:05
    יום שלישי 01 אוקטובר 2013 06:47
  • נשמע כמו הודעה של האפליקציה ולא של השרת SQL. זו הודעה מוכרת בפיתוח כאשר מנסים להכניס למשל ערך למיקום X למערך שיש בו פחות מ X מקומות או כל אוסף שאין בו מיקום X.

    ב SSMS בגרסת 2008 היה באג ידוע בהקשר זה. כאמור זה באג הקשור לאפליקציה וגם באפליקציה של מייקרוסופט נוצר באג כזה, אם זה לא באג לדעתי, כי מדובר בחוסר התאמה לגרסאות מאוחרות יותר של ה SQL SERVER. ז"א השגיאה היתה מופיעה לפעמים כשהיו מנסים להתחבר מ SSMS של גרסת 2008 לשרת SQL בגרסת 2012 (או 2014 או אפילו לגרסת הדנאלי שהיא הבטא של ה 2012). יצא לזה תיקון שפורסם עם אחד השיחרורים של העדכונים.

    לדעתי כדאי לנטר את האפליקציה שלכם תחילה ולבדוק מה קורה ומה הודעות השגיאה שמגיעות ממנה/אליה => לבדוק את הקוד


    [Personal Site] [Blog] [Facebook]signature

    • נערך על-ידי pituachMVP, Editor יום ראשון 29 ספטמבר 2013 16:16
    • סומן כתשובה על-ידי michal12 יום ראשון 29 ספטמבר 2013 17:53
    יום ראשון 29 ספטמבר 2013 16:15
    מנחה דיון
  • אני לא יודע מה ההשפעה של בניית אינדקסים מחדש בשרת ה SQL על האפליקציה שלכם. על פני השטח אם הבעיה קשורה האפליקציה אז אין קשר ישיר. אנחנו עוסקים במערכות מיחשוב מורכבות ויש הרבה תלות בין רכיבים שונים. כדי לעלות על הבעיה ספציפית צריך לנטר את הבעיה תחילה. פורום זה לא מקום לבצע ניטור מרחוק בלי להכיר את המערכת. אנחנו רק יכולים לזרוק רעיונות ומקרים מוכרים אבל בסופו של דב ר הניטור יעשה רק על ידי מי שמכיר את המערכת (או גורם חיצוני שילמד את המערכת תחילה).

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

    * הנתון שזה התחיל רק מהשדרוג מעלה את השאלה אם האפליקציה לא התנת מאז? האם לא נעשה שום שינוי ובוודאות את יודעת שאם תחזירי גרסת SQL ישנה יותר הכל יעבוד? זה חלק מהניטור! אני רק זרקתי שזו הודעה מוכרת במקרים מסויימים באפליקציות ומכיוון שאין לך הודעת שגיאה ב SQL מתחילים לדוק את מי שכן זורק הודעות שגיאה = האפליקציה.

    ** מדוע בנייה של אינדקס יכולה להשפיע?!? סתם בזריקה רעיון תיאורטי רק כדי להראות מורכבות של העניינים

    אפליקציה פונה למסד הנתונים ומקבלים אינפורמציה מהאינדקס (נעשתה פעולה של index scan בשאילתה וכל המידע הגיע מהאינדקס עצמו). נניח שהנתונים הגיעו אל האפליקציה בצורה איטית ב STREAM או בזה אחרי זה, ולא בטרנזקציה ב BULK (כמו שעובד ה SSMS דרך אגב שאם מריצים שאילתת SELECT שמחזירה הרבה מאוד רשומות, אז רואים את הנתונים מגיעים בהדרגה והטבלה של התוצאות גדלה בהדרגה). עתה נניח שעבר הזמן המקסימלי של החיבור (זמן שאילתה קשור לאינדקס ולבנייה שלו מחדש), או שהיתה רשומה אחת שיצרה בעיה בשאילתה והשרת מעביר הודעת שגיאה לאפליקציה תוך כדי העברת הנתונים. ה SSMS במקרה זה מעביר אותנו ממסך התוצאות אל מסך ההודעות ומציג את ההודעה של השגיאה, אבל חלק מהנתונים כבר הגיעו אליו וניתן לצפות בהם ב SSMS, וככה גם לאפליקציה שלכם אולי, לכן ייתכן שבכלל התוצאות שלכן בשאילתות לא נכונות וכוללות חלק מהנתונים בלבד והודעת השגיאה לא הועברה ולא טופלה כיאות באפליקציה... אני לא אומר שזה המצב וזה רק זריקה תיאורטית שאני דיי בטוח שלא הייתי מתחיל מזה אצלכם... אבל האם זה אפשרי? התשובה כן, תיאורטית :-)

    הנה דוגמה: בשאילתה הבאה אני מבצע את הפעולות הבאות (תריצי ב SSMS)

    1. יוצר טבלה חדשה עם טור לטקסט קצר וטור לטקסט ארוך

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

    3. אני ממלא נתון נוסף אבל הפעם בטור של הטקסט הקצר אני שם אות ולא מספר (זה טור של טקסט למרות ששמתי בו מספרים קודם)

    לכן קיבלתי טבלה עם 10K רשומות שבטור הראשון יש מספר ורשומה אחת שיש לה בטור הראשון אות A

    4. אני מוסיף CLUSTERED INDEX כדי לקבוע את הסידור של הנתונים וכדי שנוכל לקרוא את הנתונים מהאינדקס בלבד (אנחנו רוצים להראות השפעה של אינדקס אחרי הכל).

    5. אני מריץ את השאילתה הפשוטה של בחירת הנתונים עם המרה ל INT. כל הנתונים פרט לאחרון מומרים בלי בעיה אבל באחרון יש בעיה ועולה שגיאה.

    שימי לב שה SSMS מציג את כל ה 10K נתונים הראשונים ורק אז מעלה את השגיאה. ז"א האפליקציה קיבלה את הנתונים וכבר יכולה לעבוד איתם והשגיאה מגיעה תוך כדי כמוסבר מעל (תמיד תזכרי שה SSMS הוא אפליקציה חיצונית לכל דבר ואינו חלק מהשרת SQL, כל ההבדל זה שהוא מגיע בדרך כלל ביחד כי זה כלי נוח לניהול השרת).

    USE QQ
    GO

    create table QQ1 ( TXT nvarchar(10) , LongTXT nvarchar(MAX) ) GO insert QQ1(TXT,LongTXT) select top 10000 N,dbo.ArielyRandomStringFunc(100, 0) from dbo.Numbers GO insert QQ1(TXT,LongTXT) select top 1 'A',dbo.ArielyRandomStringFunc(100, 0) from dbo.Numbers GO -- יש לנו כרגע 10000 רשומות עם מספרים ונתון אחד שאינו מספרי SELECT * FROM QQ1 GO CREATE clustered index MyQQIndex on QQ1(TXT) GO select CONVERT(INT,TXT) from QQ1 GO drop table QQ1

    זה אמור להראות מצב תאורתי בלבד... אני מקווה שזה עוזר


    [Personal Site] [Blog] [Facebook]signature

    • נערך על-ידי pituachMVP, Editor יום שני 30 ספטמבר 2013 04:59
    • סומן כתשובה על-ידי michal12 יום שני 30 ספטמבר 2013 06:47
    יום ראשון 29 ספטמבר 2013 19:06
    מנחה דיון

כל התגובות

  • נשמע כמו הודעה של האפליקציה ולא של השרת SQL. זו הודעה מוכרת בפיתוח כאשר מנסים להכניס למשל ערך למיקום X למערך שיש בו פחות מ X מקומות או כל אוסף שאין בו מיקום X.

    ב SSMS בגרסת 2008 היה באג ידוע בהקשר זה. כאמור זה באג הקשור לאפליקציה וגם באפליקציה של מייקרוסופט נוצר באג כזה, אם זה לא באג לדעתי, כי מדובר בחוסר התאמה לגרסאות מאוחרות יותר של ה SQL SERVER. ז"א השגיאה היתה מופיעה לפעמים כשהיו מנסים להתחבר מ SSMS של גרסת 2008 לשרת SQL בגרסת 2012 (או 2014 או אפילו לגרסת הדנאלי שהיא הבטא של ה 2012). יצא לזה תיקון שפורסם עם אחד השיחרורים של העדכונים.

    לדעתי כדאי לנטר את האפליקציה שלכם תחילה ולבדוק מה קורה ומה הודעות השגיאה שמגיעות ממנה/אליה => לבדוק את הקוד


    [Personal Site] [Blog] [Facebook]signature

    • נערך על-ידי pituachMVP, Editor יום ראשון 29 ספטמבר 2013 16:16
    • סומן כתשובה על-ידי michal12 יום ראשון 29 ספטמבר 2013 17:53
    יום ראשון 29 ספטמבר 2013 16:15
    מנחה דיון
  • תודה רבה.

    זה אכן מה שקראתי באינטרנט אבל מדוע כאשר מבצעים rebuild לאינדקסים על אותה טבלה בעייתית (מדובר בטבלה אחת בלבד) הבעיה נעלמת לזמן מה וצצה שוב לאחר כמה שבועות?

    אגב, הבעיה התחילה לאחר שדרוג של גרסת ה-SQL מ- 32bit ל- 64bit.

    יום ראשון 29 ספטמבר 2013 17:55
  • אני לא יודע מה ההשפעה של בניית אינדקסים מחדש בשרת ה SQL על האפליקציה שלכם. על פני השטח אם הבעיה קשורה האפליקציה אז אין קשר ישיר. אנחנו עוסקים במערכות מיחשוב מורכבות ויש הרבה תלות בין רכיבים שונים. כדי לעלות על הבעיה ספציפית צריך לנטר את הבעיה תחילה. פורום זה לא מקום לבצע ניטור מרחוק בלי להכיר את המערכת. אנחנו רק יכולים לזרוק רעיונות ומקרים מוכרים אבל בסופו של דב ר הניטור יעשה רק על ידי מי שמכיר את המערכת (או גורם חיצוני שילמד את המערכת תחילה).

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

    * הנתון שזה התחיל רק מהשדרוג מעלה את השאלה אם האפליקציה לא התנת מאז? האם לא נעשה שום שינוי ובוודאות את יודעת שאם תחזירי גרסת SQL ישנה יותר הכל יעבוד? זה חלק מהניטור! אני רק זרקתי שזו הודעה מוכרת במקרים מסויימים באפליקציות ומכיוון שאין לך הודעת שגיאה ב SQL מתחילים לדוק את מי שכן זורק הודעות שגיאה = האפליקציה.

    ** מדוע בנייה של אינדקס יכולה להשפיע?!? סתם בזריקה רעיון תיאורטי רק כדי להראות מורכבות של העניינים

    אפליקציה פונה למסד הנתונים ומקבלים אינפורמציה מהאינדקס (נעשתה פעולה של index scan בשאילתה וכל המידע הגיע מהאינדקס עצמו). נניח שהנתונים הגיעו אל האפליקציה בצורה איטית ב STREAM או בזה אחרי זה, ולא בטרנזקציה ב BULK (כמו שעובד ה SSMS דרך אגב שאם מריצים שאילתת SELECT שמחזירה הרבה מאוד רשומות, אז רואים את הנתונים מגיעים בהדרגה והטבלה של התוצאות גדלה בהדרגה). עתה נניח שעבר הזמן המקסימלי של החיבור (זמן שאילתה קשור לאינדקס ולבנייה שלו מחדש), או שהיתה רשומה אחת שיצרה בעיה בשאילתה והשרת מעביר הודעת שגיאה לאפליקציה תוך כדי העברת הנתונים. ה SSMS במקרה זה מעביר אותנו ממסך התוצאות אל מסך ההודעות ומציג את ההודעה של השגיאה, אבל חלק מהנתונים כבר הגיעו אליו וניתן לצפות בהם ב SSMS, וככה גם לאפליקציה שלכם אולי, לכן ייתכן שבכלל התוצאות שלכן בשאילתות לא נכונות וכוללות חלק מהנתונים בלבד והודעת השגיאה לא הועברה ולא טופלה כיאות באפליקציה... אני לא אומר שזה המצב וזה רק זריקה תיאורטית שאני דיי בטוח שלא הייתי מתחיל מזה אצלכם... אבל האם זה אפשרי? התשובה כן, תיאורטית :-)

    הנה דוגמה: בשאילתה הבאה אני מבצע את הפעולות הבאות (תריצי ב SSMS)

    1. יוצר טבלה חדשה עם טור לטקסט קצר וטור לטקסט ארוך

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

    3. אני ממלא נתון נוסף אבל הפעם בטור של הטקסט הקצר אני שם אות ולא מספר (זה טור של טקסט למרות ששמתי בו מספרים קודם)

    לכן קיבלתי טבלה עם 10K רשומות שבטור הראשון יש מספר ורשומה אחת שיש לה בטור הראשון אות A

    4. אני מוסיף CLUSTERED INDEX כדי לקבוע את הסידור של הנתונים וכדי שנוכל לקרוא את הנתונים מהאינדקס בלבד (אנחנו רוצים להראות השפעה של אינדקס אחרי הכל).

    5. אני מריץ את השאילתה הפשוטה של בחירת הנתונים עם המרה ל INT. כל הנתונים פרט לאחרון מומרים בלי בעיה אבל באחרון יש בעיה ועולה שגיאה.

    שימי לב שה SSMS מציג את כל ה 10K נתונים הראשונים ורק אז מעלה את השגיאה. ז"א האפליקציה קיבלה את הנתונים וכבר יכולה לעבוד איתם והשגיאה מגיעה תוך כדי כמוסבר מעל (תמיד תזכרי שה SSMS הוא אפליקציה חיצונית לכל דבר ואינו חלק מהשרת SQL, כל ההבדל זה שהוא מגיע בדרך כלל ביחד כי זה כלי נוח לניהול השרת).

    USE QQ
    GO

    create table QQ1 ( TXT nvarchar(10) , LongTXT nvarchar(MAX) ) GO insert QQ1(TXT,LongTXT) select top 10000 N,dbo.ArielyRandomStringFunc(100, 0) from dbo.Numbers GO insert QQ1(TXT,LongTXT) select top 1 'A',dbo.ArielyRandomStringFunc(100, 0) from dbo.Numbers GO -- יש לנו כרגע 10000 רשומות עם מספרים ונתון אחד שאינו מספרי SELECT * FROM QQ1 GO CREATE clustered index MyQQIndex on QQ1(TXT) GO select CONVERT(INT,TXT) from QQ1 GO drop table QQ1

    זה אמור להראות מצב תאורתי בלבד... אני מקווה שזה עוזר


    [Personal Site] [Blog] [Facebook]signature

    • נערך על-ידי pituachMVP, Editor יום שני 30 ספטמבר 2013 04:59
    • סומן כתשובה על-ידי michal12 יום שני 30 ספטמבר 2013 06:47
    יום ראשון 29 ספטמבר 2013 19:06
    מנחה דיון
  • דרך אגב אחרי הכל צריך לזכור שהעובדה שאנחנו מכירים את ההודעה והיא מוכרת במצב מסויים זה לא פוסל שהיא קוראת גם במצב אחר

    [Personal Site] [Blog] [Facebook]signature

    יום שני 30 ספטמבר 2013 04:58
    מנחה דיון
  • תודה רבה!!! על התשובה המפורטת. סייעה לי רבות בקבלת ההחלטה :-)

    אכן, נתחיל בבדיקת הקוד.

    יום שני 30 ספטמבר 2013 06:51
  • שלום,

    זה המאמר הרשמי שמתאר את הבעיה והפתרונות האפשריים  בכל המצבים האפשריים
    http://support.microsoft.com/kb/2280390
    זה בעקרון באג ב .net framework  שיכול כפי שתיאר רונן להשפיע גם על האפליקציה וגם על SSMS 

    מקווה שעזרתי,
    נועם

     
    • סומן כתשובה על-ידי michal12 יום רביעי 02 אוקטובר 2013 10:05
    יום שלישי 01 אוקטובר 2013 06:47