KB4538581 - การแก้ไข: ปัญหาการ Inlining ของ Scalar UDF ใน SQL Server 2019

อาการ

User-Definedฟังก์ชัน (UDFs) ที่ถูกปรับใช้ใน Transact-SQL และที่ส่งกลับค่าข้อมูลเดียวเรียกว่าฟังก์ชัน T-SQL Scalar User-Defined (UDFs) 

Microsoft SQL Server 2019 ได้เริ่มใช้ฟีเจอร์การลงชื่อเข้าใช้ Scalar UDF ที่สามารถปรับปรุงประสิทธิภาพของคิวรีที่เรียกใช้ T-SQL Scalar UDFs ซึ่งการปฏิบัติการ UDF คือคอขวดหลัก การ Inlining T-SQL Scalar UDF จะแปลง UDF แบบอินไลน์ให้เป็นนิพจน์เชิงสัมพันธ์โดยอัตโนมัติ 
 

การอัปเดตสะสมนี้มีการแก้ไข หลายอย่าง ในพื้นที่ต่อไปนี้ในสถานการณ์ที่คิวรีที่ใช้การ Inlining ของ Scalar UDF อาจส่งกลับข้อผิดพลาดหรือผลลัพธ์ที่ไม่คาดคิด

  • พิมพ์ข้อผิดพลาดไม่ตรงกันถ้าชนิดการส่งกลับ UDF เป็นชนิดsql_variant (ที่เพิ่มใน Microsoft SQL Server 2019 CU2)

  • การเพิกถอน UDF sp_executesqlยกเลิกการปฏิบัติการ (ที่เพิ่มใน Microsoft SQL Server 2019 CU2)

  • UDFs อ้างอิงป้ายชื่อโดยไม่เชื่อมโยง GOTO สั่งส่งกลับผลลัพธ์ที่ไม่ถูกต้อง (เพิ่มใน Microsoft SQL Server 2019 CU2)

  • เงื่อนไขในหน่วยความจําไม่เพียงพอและการรั่วไหลของหน่วยความจําเกิดขึ้นเนื่องจาก UDFs สเกลาขนาดใหญ่มาก (ที่เพิ่มใน Microsoft SQL Server 2019 CU2)

  • ตัวแปรที่ไม่ได้เริ่มใช้ในข้อความเงื่อนไข (IF-ELSE) ทําให้เกิดข้อผิดพลาด (ถูกเพิ่มใน Microsoft SQL Server 2019 CU2)

  • ข้อผิดพลาดในการแปลงอย่างชัดเจนถ้า UDF SQL_VARIANTพารามิเตอร์ (ที่เพิ่มใน Microsoft SQL Server 2019 CU7)

  • เกิดข้อผิดพลาดยกตัวขึ้นเมื่อฟังก์ชันสเกลาอ้างอิง CHECKSUM (ที่เพิ่มใน Microsoft SQL Server 2019 CU7)

  • การรีซีก UDF ที่มีการประเมินนิพจน์สเกลาจํานวนมากอาจส่งผลให้เกิดข้อผิดพลาดตัวจัดตารางงานที่ไม่ใช่ผลตอบแทน (ที่เพิ่มใน Microsoft SQL Server 2019 CU7)

  • เกิดข้อผิดพลาดเมื่อ UDF อ้างอิงคิวรีโดยใช้ OPTION (RECOMPILE) (ที่เพิ่มใน Microsoft SQL Server 2019 CU7)

  • ข้อผิดพลาดสิทธิ์ที่เพิ่มขึ้นเมื่อมุมมอง INVOKE INLINED UDFs (เพิ่มใน Microsoft SQL Server 2019 CU9)

  • การละเมิดการเข้าถึงที่เกิดขึ้นเมื่อใช้ฟังก์ชัน XSvent query_tsql_scalar_udf_inlined (ที่เพิ่มใน Microsoft SQL Server 2019 CU9) 

  • ลักษณะการเกิดขึ้นไม่สอดคล้องกันเนื่องจากสเกลา UDF Inlining ไม่เคารพเคล็ดลับคิวรี 'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n' (ที่เพิ่มใน Microsoft SQL Server 2019 CU9)

  • UDF แบบ Inlining ประกอบด้วยการรวมที่อาจส่งผลให้เกิดข้อผิดพลาดตัวจัดตารางงานที่ไม่ใช่ผลตอบแทน (ที่เพิ่มใน Microsoft SQL Server 2019 CU9) 

  • มีข้อผิดพลาดด้านหน่วยความจําเกิดขึ้นเนื่องจากลดับของการดําเนินการสเกลาบนตัวแปรเดียวกันในการบล็อกตามเงื่อนไข (ถูกเพิ่มใน Microsoft SQL Server 2019 CU9)

การอัปเดตสะสมนี้ยัง บล็อกการขีดเส้นใต้ในสถานการณ์ต่อไปนี้

  • ถ้า UDF อ้างอิงฟังก์ชันเฉพาะบางอย่าง (ตัวอย่างเช่น @@ROWCOUNT) ที่อาจเปลี่ยนแปลงผลลัพธ์เมื่ออินลิน์ (เพิ่มใน Microsoft SQL Server 2019 CU2)

  • เมื่อฟังก์ชันการรวมถูกส่งเป็นพารามิเตอร์ไปยังสเกลา UDF (ที่เพิ่มใน Microsoft SQL Server 2019 CU2)

  • ถ้า UDF อ้างอิงมุมมองที่มีอยู่แล้วภายใน (ตัวอย่างเช่น: OBJECT_ID) (ที่เพิ่มใน Microsoft SQL Server 2019 CU2)

  • ถ้า UDF ใช้วิธีการ XML (ที่เพิ่มใน Microsoft SQL Server 2019 CU4)

  • ถ้า UDF มี SELECT ที่มี ORDER BY โดยไม่มี "TOP 1" (เพิ่มใน Microsoft SQL Server 2019 CU4)

  • ถ้าคิวรี SELECT มอบหมายงานร่วมกับส่วนสั่ง ORDER BY (ตัวอย่างเช่น SELECT @x = @x +1 FROM table ORDER BY column_name) (เพิ่มใน MICROSOFT SQL Server 2019 CU4)

  • ถ้า UDF มีหลายข้อความส่งกลับ (ที่เพิ่มใน Microsoft SQL Server 2019 CU5)

  • ถ้า UDF ถูกเรียกจากข้อความ RETURN (ที่เพิ่มใน Microsoft SQL Server 2019 CU5)

  • ถ้า UDF อ้างอิงฟังก์ชัน STRING_AGG (ที่เพิ่มใน Microsoft SQL Server 2019 CU5)

  • ถ้าข้อนิยาม UDF อ้างอิงตารางระยะไกล (เพิ่มใน Microsoft SQL Server 2019 CU6)

  • ถ้าคิวรีการโทร UDF ใช้ GROUPING SETS, CUBE หรือ ROLLUP (เพิ่มใน Microsoft SQL Server 2019 CU6)

  • ถ้าคิวรี UDF-calling มีตัวแปรที่ใช้เป็นพารามิเตอร์ UDF ในการมอบหมาย (ตัวอย่างเช่น SELECT @y=2, @x=UDF(@y)) (ที่เพิ่มใน Microsoft SQL Server 2019 CU6)

หลังจากที่คุณอัปเกรดเป็น Microsoft SQL Server 2019 CU2 แต่ก่อนที่คุณจะอัปเกรดเป็น CU5 คุณควรประเมินอีกครั้งว่า UDF มีสิทธิ์ในการลงชื่อเข้าใช้หรือไม่ เมื่อต้องการรีเฟรช UDF ที่มีสิทธิ์สเกลาผ่านวิธีการใดวิธีหนึ่งต่อไปนี้:

  • เรียกใช้ sp_refreshsqlmodule สเกลาที่บังคับใช้ UDF (ดู sp_refreshsqlmodule (Transact-SQL) เพื่อดูรายละเอียดเกี่ยวกับกระบวนงานที่จัดเก็บไว้ในระบบนี้)

  • เปลี่ยนแปลงหรือสร้างสเกลา UDF ที่มีอยู่ใหม่โดยใช้การนิยาม สิทธิ์ และตั้งค่าคุณสมบัติที่มีอยู่ (ดู ฟังก์ชัน ALTER (Transact-SQL))

สคริปต์ต่อไปนี้สร้างสคริปต์เพื่อรีเฟรชเมตาดาต้าของ UDF สเกลาที่ขีดเส้นใต้ที่มีอยู่:
 

/*

สร้างสคริปต์ที่สามารถใช้เพื่อรีเฟรช Scalar UDFs แบบอินไลน์ที่สามารถใช้งานทั้งหมดได้


หมายเหตุ sp_refreshsqlmoduleจะไม่มีผลต่อสิทธิ์ใดๆ คุณสมบัติเพิ่มเติม

หรือตัวเลือก SET ที่เกี่ยวข้องกับวัตถุ

*/

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

+ ']'';' AS 'RefreshStatement'

จาก sys.sql_modules

WHERE is_inlineable = 1

AND inline_type = 1;

GO

หมายเหตุ หลังจากที่คุณอัปเกรดเป็น Microsoft SQL Server 2019 CU5 เราจะรับ UDF แบบอินไลน์ในระหว่างการคอมไพล์อีกครั้งโดยอัตโนมัติ

สถานะ

Microsoft ยืนยันว่าปัญหานี้เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ซึ่งมีการระบุไว้ในส่วน "นำไปใช้กับ"

การแก้ไข

ปัญหานี้ได้รับการแก้ไขแล้วในการอัปเดตสะสมต่อไปนี้ของ SQL Server:

การอัปเดตสะสมใหม่แต่ละรายการของ SQL Server มีการแก้ไขด่วนทั้งหมดและการแก้ไขด้านความปลอดภัยทั้งหมดที่รวมอยู่ในการอัปเดตสะสมก่อนหน้า ดูการอัปเดตสะสมล่าสุดของ SQL Server:

อ้างอิง

เรียนรู้เกี่ยวกับ ศัพท์เฉพาะที่ Microsoft ใช้เพื่ออธิบายการอัปเดตซอฟต์แวร์

ต้องการความช่วยเหลือเพิ่มเติมหรือไม่

ขยายทักษะของคุณ
สำรวจการฝึกอบรม
รับฟีเจอร์ใหม่ก่อนใคร
เข้าร่วม Microsoft Insider

ข้อมูลนี้เป็นประโยชน์หรือไม่

ขอบคุณสำหรับคำติชมของคุณ

ขอขอบคุณสำหรับคำติชมของคุณ! เราคิดว่าอาจเป็นประโยชน์ที่จะให้คุณได้ติดต่อกับหนึ่งในตัวแทนฝ่ายสนับสนุน Office ของเรา

×