Belirtiler
Transact-SQL'de uygulanan ve tek bir veri değeri döndüren User-Defined İşlevleri (UDF), T-SQL Skaler User-Defined İşlevleri (UDF) olarak bilinir.
Skaler UDF Inlining özelliği Microsoft SQL Server 2019'da kullanıma sunulmuştur. Bu özellik, UDF yürütmesinin ana performans sorunu olduğu T-SQL Scalar UDF'leri çağıran sorguların performansını geliştirebilir. T-SQL Scalar UDF Satır içi UDF'leri otomatik olarak ilişkisel ifadelere dönüştürür.
Bu toplu güncelleştirme (CU), Scalar UDF Inlining kullanan bir sorgunun hata iletisi döndürebileceği veya beklenmeyen sonuçlar döndürebileceği senaryolar için aşağıdaki alanlarda çeşitli düzeltmeler içerir:
-
UDF'nin dönüş türü bir sql_variant ise tür uyuşmazlığı hatası oluşur (SQL Server 2019 CU2'ye eklenir).
-
sp_executesql'den gelen UDF çağrısı yürütmeyi iptal eder (SQL Server 2019 CU2'de eklendi).
-
İlişkili GOTO komutu olmadan etiketlere başvuran UDF'ler yanlış sonuçlar döndürür (SQL Server 2019 CU2'de eklendi).
-
Çok büyük skaler UDF'ler (SQL Server 2019 CU2'de eklendi) nedeniyle yetersiz bellek koşulları ve bellek sızıntıları oluşur.
-
Koşul (IF-ELSE) deyimlerinde kullanılan başlatılmamış değişkenler hatalara neden olur (SQL Server 2019 CU2'ye eklendi).
-
Bir UDF sql_variantparametresine (SQL Server 2019 CU7'de eklendi) sahipse açık dönüştürme hatası oluşur.
-
Skaler işlev CHECKSUMbaşvuruda bulunursa hata oluşur (SQL Server 2019 CU7'de eklendi).
-
Birçok skaler ifade yeniden değerlendirmesi olan UDF çağrısı, verimsiz bir zamanlayıcı hatasına neden olabilir (SQL Server 2019 CU7'de eklendi).
Not: Bu sorunun düzeltmesi bazen performans regresyonuna neden olabilir. Bu performans regresyonunu azaltmak için, izleme bayrağı (TF) 13156'yı açarak özgün düzeltmeyi devre dışı bırakabilirsiniz.
Microsoft, bu performans regresyonu için gelecekteki cu'da kullanıma sunulacak bir düzeltme üzerinde çalışmaktadır.
-
UDF başvuru sorgusu OPTION (RECOMPILE)kullanırsa hata oluşur (SQL Server 2019 CU7'de eklendi).
-
Görünümler iç içe UDF'leri çağırırsa izin hataları oluşur (SQL Server 2019 CU9'da eklenir).
-
query_tsql_scalar_udf_inlinedXEvent kullanılırsa erişim ihlalleri oluşur (SQL Server 2019 CU9'a eklenir).
-
Tutarsız davranış, Scalar UDF Inlining QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_nsorgu ipucuna (SQL Server 2019 CU9'da eklendi) uymadığından oluşur.
-
UDF'leri, verimsiz zamanlayıcı hatalarına (SQL Server 2019 CU9'da eklendi) neden olabilecek toplamalar içerir.
-
Bellek yetersiz hataları, koşullu bloklardaki (SQL Server 2019 CU9'da eklendi) aynı değişkendeki skaler işlemler dizisi nedeniyle oluşur.
-
CU9'a yükseltildikten sonra, bir nesne giriş parametresi (SQL Server 2019 CU11'de eklenmiştir) olarak kullanılan skaler satır içi bir UDF (UDF2) içeren bir skaler satır içi UDF (UDF1) çağırırsa erişim ihlali oluşur.
-
UDF'lerin eklenmesi hatalara neden olabilir ve 6846, 1011 ve 107 (SQL Server 2019 CU11'de eklendi) hata kodları oluşturabilir.
-
Sysadmin olmayan hesap olarak çalışan UDF'lerin satır içine alındığında şu hata iletisi döndürülebilir: "Geçerli komutta ciddi bir hata oluştu. Varsa sonuçlar atılmalıdır" (SQL Server 2019 CU16'da eklendi).
-
UDF'ler içinde geçici tablolar eş anlamlılar kullanılarak çağrılırsa erişim ihlali oluşur (Microsoft SQL Server 2022 CU1 ve SQL Server 2019 CU19'a eklenir).
-
UDF tanımı yalnızca GOTO etiketleri veRETURN deyimi (SQL Server 2022 CU1 ve SQL Server 2019 CU19'da eklendi) içeriyorsa erişim ihlali oluşur.
-
Skaler UDF, Scalar UDF Inlining özelliği açık olduğunda (SQL Server 2022 CU3 ve SQL Server 2019 CU20'de eklenir) sonuçları farklı tarih ve saat biçimlerinde döndürür.
-
GROUP BY yan tümcesine sahip bir sorgu, toplama işlevi olmayan bir SELECT deyiminde (SQL Server 2022 CU12 ve SQL Server 2019 CU26'da eklendi) iç içe UDF'ler kullanıyorsa döküm dosyası oluşturulur.
-
İç içe geçme düzeyi (SQL Server 2022 CU12 ve SQL Server 2019 CU26'da eklendi) Skaler UDF Inlining özelliği açıksa "En yüksek saklı yordam, işlev, tetikleyici veya görünüm iç içe geçme düzeyi aşıldı (sınır 32)" hatası oluşur.
-
Scalar UDF Inlining özelliği açıksa (SQL Server 2022 CU12 ve SQL Server 2019 CU26'ya eklenir) bellek bozulması sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf oluşur.
Bu toplu güncelleştirme, aşağıdaki senaryolarda da inlining'i engeller:
-
UDF, UDF inlined (SQL Server 2019 CU2'de eklendi) olduğunda sonuçları değiştirebilecek bazı iç işlevlere (örneğin, @@ROWCOUNT) başvuruda bulunuyorsa.
-
Toplama işlevleri skaler UDF'ye parametre olarak geçirildiğinde (SQL Server 2019 CU2'de eklendi).
-
UDF yerleşik görünümlere başvuruda bulunuyorsa (örneğin: OBJECT_ID) (SQL Server 2019 CU2'de eklendi).
-
UDF XML yöntemlerini kullanıyorsa (SQL Server 2019 CU4'te eklendi).
-
UDF,ORDER BYyan tümcesini kullanan ancak TOP 1(SQL Server 2019 CU4'te eklendi) olmayan bir SELECTdeyimi içeriyorsa.
-
SELECT deyimi ORDER BY yan tümcesi (örneğin, SELECT @x = @x +1 FROM table ORDER BY column_name) (SQL Server 2019 CU4'te eklendi) ile birlikte bir atama gerçekleştirirse.
-
UDF birden çok RETURN deyimi içeriyorsa (SQL Server 2019 CU5'te eklendi).
-
UDF bir RETURN deyiminden çağrılırsa (SQL Server 2019 CU5'te eklenir).
-
UDF STRING_AGG işlevine başvuruda bulunuyorsa (SQL Server 2019 CU5'te eklendi).
-
UDF tanımı uzak tablolara başvuruyorsa (SQL Server 2019 CU6'da eklendi).
-
UDF çağrı sorgusu GROUPING SETS, CUBEveya ROLLUP kullanıyorsa (SQL Server 2019 CU6'da eklendi).
-
UDF çağıran sorgu atama için UDF parametresi olarak kullanılan bir değişken içeriyorsa (örneğin, SELECT @y=2, @x=UDF(@y)) (SQL Server 2019 CU6'da eklendi).
-
UDF şifrelenmiş sütunlara başvuruda bulunuyorsa (SQL Server 2019 CU11'de eklendi).
-
UDF WITH XMLNAMESPACESbaşvuruları içeriyorsa (SQL Server 2019 CU11'de eklendi).
-
UDF'yi çağıran sorguda Ortak Tablo İfadeleri (CTEs) varsa (SQL Server 2019 CU11'de eklendi).
-
UDF tanımı geçici tablolar veya geçici tablolar için eş anlamlılar içeriyorsa (SQL Server 2022 CU1 ve SQL Server 2019 CU19'a eklenir).
-
UDF tanımının birden çok atama sütununa (SQL Server 2022 CU4 ve SQL Server 2019 CU20'de eklendi)DISTINCTyan tümcesi ile birlikte birSELECTdeyimi varsa.
-
UDF, TABLESAMPLE PERCENT yan tümcesini ve birden çok değişken atamasını kullanan bir SELECT deyimi içeriyorsa (SQL Server 2022 CU7'de eklendi).
-
UDF (SQL Server 2022 CU12 ve SQL Server 2019 CU26'da eklendi) içeren dizinli görünüm tarafından başvuruda bulunan bir tabloda INSERT sorgusu varsa.
SQL Server 2019 CU2'ye yükselttikten sonra, ancak SQL Server 2019 CU5'e yükseltmeden önce, UDF'nin inlining için uygun olup olmadığını yeniden değerlendirmeniz gerekir. Bunu yapmak için aşağıdaki yöntemlerden biriyle uygun skaler UDF'leri yenileyin:
-
Geçerli skaler UDF'ler için sp_refreshsqlmodule çalıştırın. Bu sistem saklı yordamı hakkında daha fazla bilgi için bkz. sp_refreshsqlmodule (Transact-SQL).
-
Mevcut tanımları, izinleri ve ayarlama özelliklerini kullanarak mevcut skaler UDF'yi değiştirin veya yeniden oluşturun. Daha fazla bilgi için bkz. ALTER FUNCTION (Transact-SQL).
Aşağıdaki komut, var olan tüm inlined skaler UDF'lerin meta verilerini yenilemek için bir betik oluşturur:
/*
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
Not: SQL Server 2019 CU5'e yükseltme yaptıktan sonra, derleme sırasında UDF satır içi kullanılabilirliğini otomatik olarak türetmeye devam edeceğiz.
Çözüm
Bu sorun, SQL Server için aşağıdaki toplu güncelleştirmelerde düzeltildi:
SQL Server için her yeni toplu güncelleştirme, önceki toplu güncelleştirmede yer alan tüm düzeltmeleri ve tüm güvenlik düzeltmelerini içerir. SQL Server için en son toplu güncelleştirmelere göz atın:
Durum
Microsoft, bunun "Şunlar için geçerlidir" bölümünde listelenen Microsoft ürünlerinde bir sorun olduğunu onayladı.
Başvurular
Microsoft'un yazılım güncelleştirmelerini açıklamak için kullandığı terminoloji hakkında bilgi edinin.