Συμπτώματα
Οι συναρτήσεις User-Defined (UDF) που υλοποιούνται στο Transact-SQL και επιστρέφουν μία τιμή δεδομένων είναι γνωστές ως T-SQL Scalar User-Defined Functions (UDFs).
Η δυνατότητα inlining Scalar UDF παρουσιάστηκε για πρώτη SQL Server Microsoft 2019. Αυτή η δυνατότητα μπορεί να βελτιώσει τις επιδόσεις των ερωτημάτων που καλούν T-SQL Scalar UDFs στα οποία η εκτέλεση UDF είναι το κύριο σημείο συμφόρησης. Η inlining T-SQL Scalar UDF μετατρέπει αυτόματα τα ενσωματωμένα UDF σε σχεσιακές παραστάσεις.
Αυτή η αθροιστική ενημέρωση (CU) περιλαμβάνει πολλές επιδιορθώσεις σε όλες τις παρακάτω περιοχές για σενάρια στα οποία ένα ερώτημα που χρησιμοποιεί Scalar UDF Inlining μπορεί να επιστρέψει ένα μήνυμα σφάλματος ή μη αναμενόμενα αποτελέσματα:
-
Παρουσιάζεται σφάλμα ασυμφωνίας τύπου εάν ο τύπος επιστροφής UDF είναι 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 εργάζεται για την επιδιόρθωσή της για αυτήν την παλινδρόμηση επιδόσεων, η οποία θα είναι διαθέσιμη σε μελλοντική cu.
-
Παρουσιάζεται σφάλμα εάν το ερώτημα αναφοράς UDF χρησιμοποιεί OPTION (RECOMPILE)(προστέθηκε στο SQL Server 2019 CU7).
-
Παρουσιάζονται σφάλματα δικαιωμάτων εάν οι προβολές καλούν ενσωματωμένα UDF (που προστέθηκαν στο SQL Server 2019 CU9).
-
Οι παραβιάσεις πρόσβασης παρουσιάζονται εάν χρησιμοποιείται τοquery_tsql_scalar_udf_inlinedXEvent (προστέθηκε στο SQL Server 2019 CU9).
-
Παρουσιάζεται ασυνεπής συμπεριφορά, επειδή η ανυπολογισμός UDF Scalar δεν τηρεί την υπόδειξη ερωτήματος QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n(προστέθηκε στο SQL Server 2019 CU9).
-
Οι inlining UDFs περιέχουν συναθροίσεις που μπορούν να προκαλέσουν σφάλματα χρονοδιαγραμμάτων που δεν αποδίδουν (προστίθενται στο SQL Server 2019 CU9).
-
Τα σφάλματα έλλειψης μνήμης προκύπτουν λόγω μιας ακολουθίας ανυσματικών λειτουργιών στην ίδια μεταβλητή σε μπλοκ υπό όρους (προστέθηκαν στο SQL Server 2019 CU9).
-
Μετά την αναβάθμιση στο CU9, παρουσιάζεται παραβίαση πρόσβασης εάν ένα αντικείμενο καλεί ένα ανυπολογισμό ενσωματωμένης UDF (UDF1) που έχει ανυπολογισμό ενσωματωμένης UDF (UDF2) που χρησιμοποιείται ως παράμετρος εισόδου (προστίθεται στο SQL Server 2019 CU11).
-
Τα inlining UDFs μπορεί να προκαλέσουν σφάλματα και να δημιουργήσουν κωδικούς σφάλματος 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).
-
Scalar UDF returns results in different date and time formats when the Scalar UDF Inlining feature is turned on (dded in SQL Server 2022 CU3 and SQL Server 2019 CU20).
-
Δημιουργείται ένα αρχείο ένδειξης σφαλμάτων, εάν ένα ερώτημα που έχει έναν όρο GROUP BY χρησιμοποιεί ενσωματωμένα UDF σε μια πρόταση SELECT χωρίς συνάρτηση συγκεντρωτικών αποτελεσμάτων (προστέθηκε στα SQL Server 2022 CU12 και SQL Server 2019 CU26).
-
Το σφάλμα "Υπέρβαση μέγιστου επιπέδου αποθηκευμένης διαδικασίας, συνάρτησης, εναύσματος ή προβολής ένθεσης (όριο 32)" προκύπτει εάν είναι ενεργοποιημένη η δυνατότητα inlining Scalar UDF, ακόμα και αν δεν γίνει υπέρβαση του επιπέδου ένθεσης (προστέθηκε στα SQL Server 2022 CU12 και SQL Server 2019 CU26).
-
Η καταστροφή της μνήμης παρουσιάζεται στο sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf εάν είναι ενεργοποιημένη η δυνατότητα Scalar UDF Inlining (προστέθηκε στα SQL Server 2022 CU12 και SQL Server 2019 CU26).
Αυτή η συγκεντρωτική ενημέρωση αποκλείει επίσης την διάρθρωση στα ακόλουθα σενάρια:
-
Εάν η 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ή 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 έχει κοινές παραστάσεις πίνακα (CTEs) (που προστέθηκαν στο 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 FUNCTION (Transact-SQL).
Η ακόλουθη εντολή δημιουργεί μια δέσμη ενεργειών για την ανανέωση των μετα-δεδομένων τυχόν υπαρχόντων ανυσματικών 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, θα συνεχίσουμε να αντλούμε αυτόματα την ενσωματωμένη δυνατότητα UDF κατά τη διάρκεια της μεταγλώττισης.
Επίλυση
Αυτό το πρόβλημα έχει διορθωθεί στις ακόλουθες αθροιστικές ενημερώσεις για SQL Server:
Κάθε νέα συγκεντρωτική ενημέρωση για SQL Server περιέχει όλες τις άμεσες επιδιορθώσεις και όλες τις επιδιορθώσεις ασφαλείας που περιλαμβάνονταν στην προηγούμενη συγκεντρωτική ενημέρωση. Δείτε τις πιο πρόσφατες συγκεντρωτικές ενημερώσεις για SQL Server:
Κατάσταση
Η Microsoft έχει επιβεβαιώσει ότι πρόκειται για πρόβλημα στα προϊόντα της Microsoft που αναφέρονται στην ενότητα "Ισχύει για".
Αναφορές
Ενημερωθείτε σχετικά με την ορολογία που χρησιμοποιεί η Microsoft για την περιγραφή ενημερώσεων λογισμικού.