KB4538581 - תיקון: בעיות בהטמעת UDF סקלרי ב- SQL Server 2022 ו- 2019

חל על
SQL Server 2019 on Windows (all editions) SQL Server 2019 on Linux (all editions) SQL Server 2022 on Windows (all editions) SQL Server 2022 on Linux (all editions)

סימפטומים

פונקציות User-Defined (UDF) המיושמות ב- Transact-SQL ומחזירות ערך נתונים יחיד ידועות כפונקציות User-Defined סקלריות (UDF) של T-SQL.

התכונה הסקלרית UDF Inlining הוצגה ב- Microsoft SQL Server 2019. תכונה זו יכולה לשפר את הביצועים של שאילתות המעוררות רכיבי UDF סקלריים של T-SQL שבהן ביצוע UDF הוא צוואר הבקבוק העיקרי. UDF סקלרי של T-SQL הטמעה הופכת באופן אוטומטי רכיבי UDF שאינם ניתנים להוטבעה לביטויים יחסיים.

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

  • שגיאת אי-התאמה מסוג מתרחשת אם סוג ההחזרה של הפונקציה UDF הוא A sql_variant (נוסף ב- SQL Server 2019 CU2).
  • הפעלת UDF מביטול sp_executesql ביצוע (נוספה ב- SQL Server 2019 CU2).
  • רכיבי UDF שמפנים לתוויות ללא פקודה משויכת GOTO מחזירים תוצאות שגויות (נוספו ב- SQL Server 2019 CU2).
  • מצבים שבהם אין זיכרון ודליפות זיכרון מתרחשים עקב UDF סקלרי גדול מאוד (נוספו ב- SQL Server 2019 CU2).
  • משתנים לא מאותחלים המשמשים במשפטי תנאי (IF-ELSE) גורמים לשגיאות (נוספו ב- SQL Server 2019 CU2).
  • שגיאת המרה מפורשת מתרחשת אם UDF כולל את sql_variant הפרמטר (נוסף ב- SQL Server 2019 CU7).
  • תתרחש שגיאה אם הפונקציה הסקלרית מפנה (CHECKSUMנוספה ב- SQL Server 2019 CU7).
  • הפעלת UDF שיש לה הערכות חוזרות של ביטויים סקלריים רבים עלולה לגרום לשגיאת מתזמן שאינה מניבה (נוספה ב-SQL Server 2019 CU7).
    הערה: התיקון לבעיה זו עלול לגרום לפעמים לרגרסיה בביצועים. כדי לצמצם רגרסיה זו בביצועים, באפשרותך להפוך את התיקון המקורי ללא זמין על-ידי הפעלת דגל מעקב (TF) 13156.
    Microsoft עובדת על תיקון עבור רגרסיה זו בביצועים, שיהיה זמין בגרסה מצטברת עתידית.
  • תתרחש שגיאה אם שאילתת ההפניה של UDF משתמשת OPTION (RECOMPILE) באפשרות (נוספה ב- SQL Server 2019 CU7).
  • שגיאות הרשאה מתרחשות אם תצוגות מפעילות פריטי UDF מוטבעים (נוספו ב- SQL Server 2019 CU9).
  • הפרות גישה מתרחשות אם query_tsql_scalar_udf_inlined נעשה שימוש ב- XEvent (נוסף ב- SQL Server 2019 CU9).
  • אופן פעולה לא עקבי מתרחש מכיוון ש-Scalar UDF Inlining אינו מכבד את רמז השאילתה QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n (נוסף ב- SQL Server 2019 CU9).
  • רכיבי UDF מוטבעים מכילים צבירות שעלולות לגרום לשגיאות מתזמן שאינן מניבות (נוספו ב- SQL Server 2019 CU9).
  • שגיאות חוסר זיכרון מתרחשות עקב רצף של פעולות סקלריות על אותו משתנה בבלוקים מותנים (נוסף ב SQL Server 2019 CU9).
  • לאחר השדרוג ל- CU9, מתרחשת הפרת גישה אם אובייקט מפעיל UDF סקלרי בלתי ניתן לשורה (UDF1) בעל UDF סקלרי בלתי ניתן לשורה (UDF2) המשמש כפרמטר קלט (נוסף ב- SQL Server 2019 CU11).
  • הכנסת UDF עלולה לגרום לשגיאות וליצור את קודי השגיאה 6846, 1011 ו- 107 (נוספו ב- SQL Server 2019 CU11).
  • הוספה של רכיבי UDF שפועלים כחשבון שאינו sysadmin עלולה להחזיר את הודעת השגיאה, "אירעה שגיאה חמורה בפקודה הנוכחית. התוצאות, אם בכלל, צריכות להימחק" (נוסף ב- SQL Server 2019 CU16).
  • מתרחשת הפרת גישה אם טבלאות זמניות מופעלות בתוך רכיבי UDF באמצעות מילים נרדפות (נוספו ב- Microsoft SQL Server 2022 CU1 וב- SQL Server 2019 CU19).
  • הפרת גישה מתרחשת אם הגדרת UDF מכילה רק GOTO תוויות והצהרה RETURN (נוספה ב- SQL Server 2022 CU1 וב- SQL Server 2019 CU19).
  • UDF סקלרי מחזיר תוצאות בתבניות תאריך ושעה שונות כאשר התכונה הסקלרית UDF Inlining מופעלת (נוספה ב- SQL Server 2022 CU3 וב- SQL Server 2019 CU20).
  • קובץ dump נוצר אם שאילתה המכילה GROUP BY משפט משתמשת ב- UDF מוטבעים במשפט SELECT ללא פונקציית צבירה (נוספה ב- SQL Server 2022 CU12 וב- SQL Server 2019 CU26).
  • השגיאה "חריגה מרמת הקינון המרבית של פרוצדורה, פונקציה, גורם מפעיל או תצוגה מאוחסנים (מגבלה 32)" מתרחשת אם התכונה הסקלרית UDF Inlining מופעלת, גם אם לא בוצעה חריגה מרמת הקינון (נוספה ב- SQL Server 2022 CU12 ו- SQL Server 2019 CU26).
  • פגמים בזיכרון מתרחשים אם sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf התכונה הסקלרית UDF Inlining מופעלת (נוספה ב- SQL Server 2022 CU12 וב- SQL Server 2019 CU26).
  • תוצאות שגויות מתרחשות עקב השילוב של Scalar UDF Inlining ובאותה OPTION (RECOMPILE) שאילתה (נוספה ב- SQL Server 2022 CU17 וב- SQL Server 2019 CU31).

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

  • אם ה- UDF מפנה לפונקציות פנימיות מסוימות (לדוגמה, @@ROWCOUNT) שעשויות לשנות את התוצאות אם ה- UDF מוטבע (נוסף ב- SQL Server 2019 CU2).
  • אם פונקציות צבירה מועברות כפרמטרים ל- UDF סקלרי (נוסף ב- SQL Server 2019 CU2).
  • אם ה- UDF מפנה לתצוגות מוכללות (לדוגמה: OBJECT_ID) (נוספו ב- SQL Server 2019 CU2).
  • אם הפונקציה UDF משתמשת בפעולות שירות של XML (נוספו ב- SQL Server 2019 CU4).
  • אם ה- UDF מכיל SELECT משפט המשתמש ORDER BY במשפט אך לא TOP 1 (נוסף ב- SQL Server 2019 CU4).
  • אם המשפט SELECT מבצע הקצאה יחד עם ORDER BY המשפט (לדוגמה, SELECT @x = @x +1 FROM table ORDER BY column_name) (נוסף ב- SQL Server 2019 CU4).
  • אם ה- UDF מכיל משפטים מרובים RETURN (נוספו ב- SQL Server 2019 CU5).
  • אם הקריאה ל- UDF מתבצעת RETURN ממשפט (נוסף ב- SQL Server 2019 CU5).
  • אם ה- UDF מפנה לפונקציה STRING_AGG (נוספה ב- SQL Server 2019 CU5).
  • אם הגדרת ה- UDF מפנה לטבלאות מרוחקות (נוספה ב- SQL Server 2019 CU6).
  • אם השאילתה של קריאת UDF משתמשת בGROUPING SETS- , CUBE, or ROLLUP (נוסף ב- SQL Server 2019 CU6).
  • אם שאילתת הקריאה ל- UDF מכילה משתנה המשמש כפרמטר UDF להקצאה (לדוגמה, SELECT @y=2, @x=UDF(@y)) (נוסף ב- SQL Server 2019 CU6).
  • אם ה- UDF מפנה לעמודות מוצפנות (נוספו ב- SQL Server 2019 CU11).
  • אם ה- UDF מכיל הפניות אל WITH XMLNAMESPACES (נוסף ב- SQL Server 2019 CU11).
  • אם השאילתה שמפעילה את הפונקציה UDF כוללת ביטויי טבלה נפוצים (CTE) (נוספו ב- SQL Server 2019 CU11).
  • אם הגדרת ה- UDF מכילה טבלאות זמניות או מילים נרדפות לטבלאות זמניות (נוספו ב- SQL Server 2022 CU1 וב- SQL Server 2019 CU19).
  • אם הגדרת ה- UDF כוללת SELECT משפט יחד עם DISTINCT משפט בעמודות הקצאה מרובות (נוספו ב- SQL Server 2022 CU4 וב- SQL Server 2019 CU20).
  • אם ה- UDF מכיל SELECT משפט המשתמש במשפט TABLESAMPLE PERCENT ובהקצאות משתנים מרובות (נוספו ב- SQL Server 2022 CU7).
  • INSERT אם קיימת שאילתה בטבלה שמתבצעת אליה הפניה על-ידי תצוגה סדורה באינדקס המכילה UDF (נוסף ב- SQL Server 2022 CU12 וב- SQL Server 2019 CU26).

לאחר השדרוג ל- SQL Server 2019 CU2, אך לפני השדרוג ל- SQL Server 2019 CU5, עליך להעריך מחדש אם UDF זכאי להטמעה. לשם כך, רענן רכיבי UDF סקלריים זכאים באמצעות אחת מהשיטות הבאות:

  • הפעל sp_refreshsqlmodule עבור UDF סקלריים ישימים. לקבלת מידע נוסף אודות פרוצדורה זו המאוחסנת במערכת, ראה sp_refreshsqlmodule (Transact-SQL).
  • שנה או צור מחדש את ה- UDF הסקלרי הקיים באמצעות הגדרות, הרשאות ומאפייני הגדרה קיימים. לקבלת מידע נוסף, ראה הפונקציה ALTER (Transact-SQL).

הפקודה הבאה יוצרת קובץ Script לרענון המטה-נתונים של כל רכיבי ה- UDF הסקלרים המוטבעים הקיימים:


/*

Generates a script that can be used to refresh all active inlineable scalar UDFs.

Note The sp_refreshsqlmodule command does not affect any permissions, extended properties, or SET options that are associated with the object.

*/

SELECT 'EXECUTE sys.sp_refreshsqlmodule ''[' + OBJECT_SCHEMA_NAME(object_id) + +'].' + '[' + OBJECT_NAME(object_id)

+ ']'';' AS 'RefreshStatement'

FROM sys.sql_modules

WHERE is_inlineable = 1

AND inline_type = 1;

GO

הערה: לאחר השדרוג ל SQL Server 2019 CU5, נמשיך לפעול באופן אוטומטי לצורך הפקת יכולת inlineability של UDF במהלך ההידור.

פתרון

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

אודות עדכונים מצטברים עבור SQL Server

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

מצב

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

חומרי עזר

קבל מידע על המינוח שבו משתמשת Microsoft כדי לתאר עדכוני תוכנה.