KB3067257-FIX: תוצאות חלקיות בשאילתה של אינדקס columnstore מקובץ באשכולות ב-SQL Server 2014

מאמר זה דן בבעיה המתרחשת במהלך שאילתה של אינדקס columnstore מקובץ באשכולות ב-Microsoft SQL Server 2014. מאמר זה מספק פתרון לבעיה זו.

סיכום

בעת שימוש בשאילתה הסורקת אינדקס columnstore מקובץ באשכולות ב-Microsoft SQL Server 2014, ייתכן שתחת תנאים נדירים, תקבל תוצאות שאילתה חלקיות. בעיה זו מתרחשת כאשר הפעולה הבאה מופעלת.

שלב 1

משפט Transact-SQL [הוספה או הוספה בצובר] הוספת נתונים לטבלה הכוללת אינדקס של columnstore באשכולות. במהלך פעולה זו, התנאים הבאים חלים:

  • כאשר המשפט Transact-SQL מגיע לסף rowgroup, הוא סוגר את rowgroup R1 שמכיל את המקטע S1.

  • המקטע S1 מצביע על מילון מקומי D1.

  • המשפט ממשיך להוסיף שורות ל-new rowgroup R2.

  • כאשר rowgroup R1 סגור, גם המילון המקומי D1 אינו חייב להיסגר. אם מילון D1 עדיין כולל שטח זמין, באפשרותך להשאיר אותו פתוח ולעשות בו שימוש חוזר עבור ה-rowgroup R2 החדש.

שלב 2

אם המשפט Transact-SQL מסתיים בצורה חריגה או מבוטלת לפני סגירת rowgroup R2 החדש, התנאים הבאים חלים:

  • שינויי מטה-נתונים של Columnstore מתרחשים ב-subtransactions שמתבצעים באופן עצמאי מהתנועה החיצונית.

  • בשלב זה, rowgroup R1 נמשך בטבלת המערכת ב-"תחת הבנייה" או במצב בלתי נראה, ומקטע S1 מפנה מילון D1.

  • לא נוצרת שורה בטבלת המערכת עבור מילון D1. הסיבה לכך היא שלמשפט Transact-SQL אין אף פעם הזדמנות לסגור את השורה הקיימת. לכן השורה הקיימת נמשכת.

שלב 3

במצב אופייני, אם משימת הרקע של ' מעבר הרשומה ' מתחילה לאחר הסיום של משפט ה-Transact-SQL, משימת הרקע מסירה את הrowgroup הבלתי נראה של R1 ואת המקטע S1. אם משפט Transact-SQL חדש מופעל כעת ויוצר את rowgroup R3 הכולל S3 מקטע חדש הדורשת מילון מקומי חדש, לא תוכל לעשות שימוש חוזר במזהה הפנימי של המילון D1. הסיבה לכך היא שהמצב בזיכרון של ה-columnstore עוקב אחר מזהי המילון הנמצאים בשימוש. לכן, המקטע S3 מפנה למילון החדש של D2.הערה התנאי בשלב זה הוא תנאי נפוץ. לכן, לא מתרחשת כל שחיתות.

שלב 4

אם SQL Server מאבד את המצב בזיכרון של מילון D1 לפני שהמשימה המובילה בין המשתנים מתקבלת לתוקף (ומבצעת כמתואר בשלב 3), הבעיה המתוארת במאמר זה מתרחשת.הערות

  • אירוע זה מתרחש מאחת הסיבות הבאות:

    • שרתי SQL Server חווים עומס יתר בזיכרון, והתוכן בתוך הזיכרון של המילון D1 מסולק מהזיכרון.

    • המופע של SQL Server מופעל מחדש.

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

  • לאחר שמתרחש אחד מהאירועים האלה, ושרת SQL מטעין משוב את המבנים בתוך הזיכרון, אין כל רשומה שקיימת במילון מילון D1 והמזהה הפנימי שלו. הסיבה לכך היא שמילון D1 לא נשמר בטבלאות המערכת כאשר המשפט Transact-SQL הסתיים או conceled.

  • אם משימת הרקע של מעבר הרשומה מופעלת בשלב זה, לא מתרחשות שגיאות משום שהתנאים המתוארים בשלב 3 חלים.

  • אם rowgroup R3 חדש נוצר לפני שפעילות הרקע של ' מעבר הרשומה ' מתחילה (לפי פריט התבליט הקודם), SQL Server מקצה את אותו מזהה פנימי למילון החדש D1, והוא מפנה למילון D1 עבור מקטע S3 ב-rowgroup R3.

  • כאשר משימת הרקע של ' מעבר הרשומה ' מתחילה לאחר הפעולה הקודמת, היא מפילה את rowgroup הבלתי נראה של R1 והמקטעים שלה S1 יחד עם המילון החדש D1. מצב זה מתרחש מאחר שהמעלה של הרשומה מראה שהמילון החדש D1 והמילון המקורי D1 שהפניות S1 זהות.הערה כאשר תנאי זה מתרחש, אין באפשרותך לבצע שאילתה על התוכן של rowgroup R3.

פתרון הבעיה

הבעיה נפתרה לראשונה בעדכונים המצטברים הבאים עבור SQL Server:

עדכון מצטבר 1 עבור Sql server 2014 SP1 מצטבר של עדכון 8 עבור sql server 2014התיקון לבעיה זו כלול גם בעדכונים הבאים של מהדורת ההפצה הכללית (GDR):

עדכון אבטחה עבור SQL Server 2014 QFE  עדכון זה כולל עדכון מצטבר 8, תיקון חשוב זה ועדכוני האבטחה הנדרשים של MS15-058.עדכון אבטחה עבור SQL Server 2014 GDR  עדכון זה כולל תיקון חשוב זה ותיקוני אבטחה מצטברים במהלך MS15-058.עדכון בנושא אבטחה עבור מחשב משנה של SQL Server 2014 Service Pack 1  עדכון זה כולל רק תיקון חשוב זה.

כל עדכון מצטבר חדש עבור SQL Server מכיל את כל התיקונים החמים ואת כל תיקוני האבטחה שנכללו בעדכון המצטבר הקודם. ראה את העדכונים המצטברים האחרונים עבור SQL Server:

מידע נוסף

הודעות שגיאהבמסד נתונים מושפע כעת, אם אתה מפעיל את DBCC CHECKDB לאחר החלת תיקון זה, אתה מקבל את הודעת השגיאה הבאה:

Msg 5289, Level 16, מדינה 1, Line 1 מקובצים באשכולות columnstore index ' cci ' בטבלה t ' מכיל ערך נתונים אחד או יותר שאינם מתאימים לערכי נתונים במילון. שחזר את הנתונים מהגיבוי.

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

Msg 5288, Level 16, State 1, Line 1 Columnstore index מכיל ערך נתונים אחד או יותר שאינם מתאימים לערכי נתונים במילון. הפעילו את DBCC CHECKDB לקבלת מידע נוסף.

אם אתה מקבל שגיאות אלה, באפשרותך לשמור את הנתונים הלא פגומים על-ידי ייצוא מסחרי של הנתונים של עמודות לא מושפעות/rowgroups ולאחר מכן טעינה מחדש של הנתונים לאחר שחרור או יצירה של אינדקס columnstore מקובץ באשכולות. עליך להפוך את סימון דגל 10207 לזמין כדי לדכא את שגיאת 5288 ולחזור להתנהגות הישנה של דילוג על rowgroups פגומים. הערה הודעות שגיאה 5288 ו-5289 נוצרות עבור rowgroup R3 המכיל את המקטע S3. מעקב אחר דגל 10207 משמש לחילוץ המקטעים של rowgroup R3 שאינם מושפעים מהמילון D1 החסר.

שאילתה עבור מסדי נתונים מושפעיםכדי לקבוע אם מסד הנתונים המכיל אינדקסים של columnstore כבר מושפע מבעיה זו, הפעלת השאילתה הבאה:

select         object_name(i.object_id) as table_name,        i.name as index_name,        p.partition_number,        count(distinct s.segment_id) as damaged_rowgroups from        sys.indexes i        join sys.partitions p on p.object_id = i.object_id and p.index_id = i.index_id        join sys.column_store_row_groups g on g.object_id = i.object_id and g.index_id = i.index_id and g.partition_number = p.partition_number        join sys.column_store_segments s on s.partition_id = p.partition_id and s.segment_id = g.row_group_id where         i.type in (5, 6)        and s.secondary_dictionary_id <> -1         and g.state_description = 'COMPRESSED'        and s.secondary_dictionary_id not in        (               select dictionary_id from sys.column_store_dictionaries d               where d.hobt_id = p.hobt_id and d.column_id = s.column_id        ) group by         object_name(i.object_id),        i.name,        p.partition_number 

הערות

  • עליך להפעיל שאילתה זו כנגד כל מסד נתונים המכיל אינדקסים של columnstore בשרת שבו פועל SQL Server. ערכת תוצאות ריקה מציינת שמסד הנתונים אינו מושפע.

  • ביצוע שאילתה זו במהלך תקופה שבה אין פעילות שתיצור rowgroups חדש או תשנה את מצב הrowgroups הקיים. לדוגמה, הפעילויות הבאות יכולות לשנות את המצב של rowgroups: index build, index סידור מחדש, הוספה בצובר, מעבר בין מובילים של מובילי משנה בדחיסת מאגרי דלתא. לפני ביצוע השאילתה, באפשרותך להפוך את משימת ההובלה של הרקע לבלתי זמינה באמצעות דגל המעקב 634. השתמש בפקודה זו כדי להפוך את משימת הרקע ללא זמינה: DBCC TRACEON (634,-1). לאחר שהשאילתה מסיימת לבצע את הביצוע, זכור להפעיל מחדש את משימת הרקע באמצעות הפקודה: DBCC TRACEOFF (634,-1). כמו כן, ודא שאין באפשרותך להוסיף הוספת נתונים לטבלאות המשתמשות באינדקס columnstore כאשר שאילתה זו פועלת. מומלץ להשתמש בשלבים אלה כדי למנוע מהשאילתה להחזיר תוצאות חיוביות false.

מצב

Microsoft אישרה שזוהי בעיה במוצרי Microsoft המופיעים בסעיף "חל על".

זקוק לעזרה נוספת?

הרחב את הכישורים שלך
סייר בהדרכה
קבל תכונות חדשות לפני כולם
הצטרף למשתתפי Microsoft insider

האם מידע זה היה שימושי?

תודה על המשוב!

תודה על המשוב! נראה שכדאי לקשר אותך לאחד מנציגי התמיכה של Office.

×