סימפטומים
פונקציות 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, orROLLUP(נוסף ב- 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 כדי לתאר עדכוני תוכנה.