Belirtiler
Transact-SQL'de uygulanan ve tek bir veri değeri döndüren User-Defined İşlevler (UDF'ler), T-SQL Skaler User-Defined İşlevleri (UDF'ler) olarak bilinir.
Skaler UDF Satır İçi özelliği, Microsoft SQL ServerSQL Server 2019'da tanıtıldı. Bu özellik, UDF yürütmenin ana performans sorunu olduğu T-SQL Skaler UDF'lerini çağıran sorguların performansını artırabilir. T-SQL Skaler UDF Satır İçi, satır içi UDF'leri otomatik olarak ilişkisel ifadelere dönüştürür.
Bu toplu güncelleştirme (CU), Skaler UDF Satır İçi kullanan bir sorgunun hata iletisi veya beklenmeyen sonuçlar döndürebildiği senaryolar için aşağıdaki alanlarda çeşitli düzeltmeler içerir:
- Tür uyuşmazlığı hatası, UDF'nin dönüş türü a
sql_variantise oluşur (SQL ServerSQL Server 2019 CU2). - UDF çağrısı
sp_executesql, yürütmeyi iptal eder (SQL ServerSQL Server 2019 CU2'ye eklenmiştir). - İlişkili
GOTObir komut olmadan etiketlere başvuran UDF'ler yanlış sonuçlar döndürür (SQL ServerSQL Server 2019 CU2'ye eklenmiştir). - Yetersiz bellek koşulları ve bellek sızıntıları, çok büyük skaler UDF'ler nedeniyle oluşur (SQL ServerSQL Server 2019 CU2).
- condition (
IF-ELSE) deyimlerinde kullanılan başlatılmamış değişkenler hatalara neden olur (SQL ServerSQL Server 2019 CU2'ye eklenmiştir). - Bir UDF'de
sql_variantparametre varsa açık dönüştürme hatası oluşur (SQL ServerSQL Server 2019 CU7'ye eklenmiştir). - Skaler işlev başvuruyorsa
CHECKSUMhata oluşur (SQL ServerSQL Server 2019 CU7'ye eklenmiştir). - Birçok skaler ifade yeniden değerlendirmesine sahip UDF çağrısı, verimsiz bir zamanlayıcı hatasına neden olabilir (SQL ServerSQL Server 2019 CU7'ye eklenmiştir).
Not: Bu sorunun düzeltmesi bazen performansta gerilemeye neden olabilir. Bu performans gerilemesinin etkisini azaltmak için, izleme bayrağı (TF) 13156'yı açarak özgün düzeltmeyi devre dışı bırakabilirsiniz.
Microsoft, bu performans gerilemesine yönelik bir düzeltme üzerinde çalışmaktadır ve bu düzeltme gelecekteki bir toplu güncelleştirmede kullanıma sunulacaktır. - UDF başvuru sorgusu kullanıyorsa
OPTION (RECOMPILE)hata oluşur (SQL ServerSQL Server 2019 CU7). - Görünümler satır içi UDF'leri çağırırsa izin hataları oluşur (SQL ServerSQL Server 2019 CU9'a eklenmiştir).
- XEvent kullanılırsa
query_tsql_scalar_udf_inlinederişim ihlalleri oluşur (SQL ServerSQL Server 2019 CU9'a eklenmiştir). - Tutarsız davranış Skaler UDF Satır İçi sorgu ipucuna
QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_nuymadığından oluşur (SQL ServerSQL Server 2019 CU9 bölümüne eklenmiştir). - Satır içi UDF'ler, verimsiz zamanlayıcı hatalarına neden olabilecek toplamalar içerir (SQL ServerSQL Server 2019 CU9'a eklenmiştir).
- Yetersiz bellek hataları, koşullu bloklarda aynı değişken üzerinde bir dizi skaler işlem nedeniyle oluşur (SQL ServerSQL Server 2019 CU9'a eklenmiştir).
- CU9'a yükselttikten sonra, bir nesne giriş parametresi olarak kullanılan skaler satır içi UDF'ye (UDF2) sahip skaler bir satır içi kullanılabilir UDF'yi (UDF1) çağırırsa erişim ihlali oluşur (SQL ServerSQL Server 2019 CU11'e eklenmiştir).
- Satır içi UDF'ler hatalara neden olabilir ve 6846, 1011 ve 107 hata kodları oluşturabilir (SQL ServerSQL Server 2019 CU11'e eklenmiştir).
- Sistem yöneticisi olmayan hesap olarak çalıştırılan satır içi UDF'ler şu hata iletisini döndürebilir: "Geçerli komutta önemli bir hata oluştu. Varsa, sonuçlar atılmalıdır" (SQL ServerSQL Server 2019 CU16 bölümüne eklenmiştir).
- Eş anlamlılar kullanılarak UDF'ler içinde geçici tablolar çağrılırsa erişim ihlali oluşur (Microsoft SQL ServerSQL Server 2022 CU1 ve SQL ServerSQL Server 2019 CU19).
- UDF tanımı yalnızca
GOTOetiketler ve birRETURNdeyim içeriyorsa (SQL ServerSQL Server 2022 CU1 ve SQL ServerSQL Server 2019 CU19) erişim ihlali oluşur. - Skaler UDF, Skaler UDF Satır İçi özelliği açıldığında sonuçları farklı tarih ve saat biçimlerinde döndürür (SQL ServerSQL Server 2022 CU3 ve SQL ServerSQL Server 2019 CU20'ye eklenmiştir).
- Yan tümcesi olan
GROUP BYbir sorgu, toplama işlevi olmayan birSELECTdeyimde satır içi UDF'ler kullanıyorsa bir döküm dosyası oluşturulur (SQL ServerSQL Server 2022 CU12 ve SQL ServerSQL Server 2019 CU26). - İç içe geçirme düzeyi aşılmasa bile Skaler UDF Satır İçi özelliği açıksa "En fazla depolanmış 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 (SQL ServerSQL Server 2022 CU12 ve SQL ServerSQL Server 2019 CU26'ya eklenmiştir).
- Skaler UDF Satır İçi özelliği açıksa bellek bozulması oluşur
sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf(SQL ServerSQL Server 2022 CU12 ve SQL ServerSQL Server 2019 CU26). - Skaler UDF Satır İçi kombinasyonu ve
OPTION (RECOMPILE)aynı sorguda (SQL ServerSQL Server 2022 CU17 ve SQL ServerSQL Server 2019 CU31) kombinasyonu nedeniyle yanlış sonuçlar oluşur.
Bu toplu güncelleştirme aşağıdaki senaryolarda da satır içi işlemleri engeller :
- UDF belirli içsel işlevlere başvuruyorsa (örneğin,
@@ROWCOUNT), UDF satır içi ise sonuçları değiştirebilir (SQL ServerSQL Server 2019 CU2'ye eklenmiştir). - Toplama işlevleri skaler UDF'ye parametre olarak geçirilirse (SQL ServerSQL Server 2019 CU2'ye eklenir).
- UDF yerleşik görünümlere başvuruyorsa (örneğin:
OBJECT_ID) (SQL ServerSQL Server 2019 CU2'ye eklenmiştir). - UDF, XML yöntemlerini kullanıyorsa (SQL ServerSQL Server 2019 CU4'e eklenmiştir).
- UDF, yan tümceyi
ORDER BYkullanan ancak kullanmayanTOP 1birSELECTdeyim içeriyorsa (SQL ServerSQL Server 2019 CU4'e eklenmiştir). -
SELECTDeyim, yan tümceyleORDER BYbirlikte bir atama gerçekleştirirse (örneğin,SELECT @x = @x +1 FROM table ORDER BY column_name) (SQL ServerSQL Server 2019 CU4 içine eklenmiştir). - UDF birden çok
RETURNdeyim içeriyorsa (SQL ServerSQL Server 2019 CU5'e eklenmiştir). - UDF bir
RETURNdeyimden çağrılırsa (SQL ServerSQL Server 2019 CU5'e eklenmiştir). - UDF işleve başvuruyorsa
STRING_AGG(SQL ServerSQL Server 2019 CU5'e eklenmiştir). - UDF tanımı uzak tablolara başvuruyorsa (SQL ServerSQL Server 2019 CU6'ya eklenmiştir).
- UDF çağırma sorgusu
GROUPING SETS,CUBE, veyaROLLUPkullanıyorsa (SQL ServerSQL Server 2019 CU6'ya eklenmiştir). - UDF çağırma sorgusu, atama için UDF parametresi olarak kullanılan bir değişken içeriyorsa (örneğin,
SELECT @y=2, @x=UDF(@y)) (SQL ServerSQL Server 2019 CU6'ya eklenmiştir). - UDF şifrelenmiş sütunlara başvuruyorsa (SQL ServerSQL Server 2019 CU11'de eklenmiştir).
- UDF, SQL ServerSQL Server 2019 CU11'e başvurular
WITH XMLNAMESPACESiçeriyorsa (SQL ServerSQL Server 2019 CU11'e eklenmiştir). - UDF'yi çağıran sorguda Ortak Tablo İfadeleri (CTE'ler) varsa (SQL ServerSQL Server 2019 CU11'e eklenmiştir).
- UDF tanımı, geçici tablolar veya geçici tablolar için eş anlamlılar içeriyorsa (SQL ServerSQL Server 2022 CU1 ve SQL ServerSQL Server 2019 CU19 bölümlerine eklenmiştir).
- UDF tanımında birden çok atama sütununda bir
DISTINCTyan tümce ile birlikte birSELECTifade varsa (SQL ServerSQL Server 2022 CU4 ve SQL ServerSQL Server 2019 CU20'ye eklenmiştir). - UDF, yan tümceyi ve birden çok değişken atamasını
TABLESAMPLE PERCENTkullanan birSELECTdeyim içeriyorsa (SQL ServerSQL Server 2022 CU7'ye eklenmiştir). - UDF içeren dizinlenmiş bir görünüm tarafından başvurulan bir tabloda bir
INSERTsorgu varsa (SQL ServerSQL Server 2022 CU12 ve SQL ServerSQL Server 2019 CU26).
SQL Server 2019 CU2'ye yükselttikten sonra, ancak SQL Server 2019 CU5'e yükseltmeden önce, UDF'nin satır içi için uygun olup olmadığını yeniden değerlendirmeniz gerekir. Bunu yapmak için, aşağıdaki yöntemlerden birini kullanarak uygun skaler UDF'leri yenileyin:
- Geçerli skaler UDF'ler için çalıştırın
sp_refreshsqlmodule. Bu sistem saklı yordamı hakkında daha fazla bilgi için bkz. sp_refreshsqlmodule (Transact-SQL). - Var olan tanımları, izinleri ve ayarlanan özellikleri kullanarak var olan skaler UDF'yi değiştirin veya yeniden oluşturun. Daha fazla bilgi için bkz. ALTER İŞLEVİ (Transact-SQL).
Aşağıdaki komut, mevcut satır içi 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ükselttikten sonra, derleme sırasında UDF satırsızlığını otomatik olarak türetmeye devam edeceğiz.
Çözüm
Bu sorun, SQL ServerSQL Server için aşağıdaki toplu güncelleştirmelerde düzeltildi:
- TSQL Server için Toplu Güncelleştirme 17 SQL Server 2022
- SQL Server 2019 için Toplu Güncelleştirme 31
SQL Server toplu güncelleştirmeleri hakkında
SQL Server için her yeni toplu güncelleştirme, önceki toplu güncelleştirmeye dahil edilen 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 sorun olduğunu onaylamıştır.
Başvurular
Microsoft'un yazılım güncelleştirmelerini tanımlamak için kullandığı terminoloji hakkında bilgi edinin.