และไม่มีอะไรเกี่ยวกับฟังก์ชั่น เหตุใดข้อมูลฟังก์ชันจึงขาดหายไปในแผนจริง
นี่คือการออกแบบด้วยเหตุผลด้านประสิทธิภาพ
ฟังก์ชันที่มีBEGIN
และEND
อยู่ในคำจำกัดความสร้างเฟรมสแต็ก T-SQL ใหม่สำหรับแต่ละแถวอินพุต วางวิธีอื่นการทำงานของร่างกายจะถูกดำเนินการแยกต่างหากสำหรับการป้อนข้อมูลแต่ละแถว ข้อเท็จจริงเดียวนี้อธิบายปัญหาประสิทธิภาพส่วนใหญ่ที่เกี่ยวข้องกับฟังก์ชันสเกลาร์ T-SQL และคำสั่งหลายคำสั่ง (โปรดทราบว่าฟังก์ชั่นที่มีค่าในตารางในบรรทัดไม่ได้ใช้BEGIN...END
ไวยากรณ์)
ในบริบทของคำถามของคุณสิ่งนี้จะทำให้ได้ผลลัพธ์เต็มรูปแบบSHOWPLAN
สำหรับแต่ละแถว เอาท์พุทแผน XML ค่อนข้างละเอียดและมีราคาแพงในการผลิตดังนั้นการสร้างเอาต์พุตเต็มรูปแบบสำหรับทุกแถวจะเป็นแนวคิดที่ไม่ดีในแง่ทั่วไป
ตัวอย่าง
พิจารณาฟังก์ชันสเกลาร์ T-SQL ด้านล่างสร้างในฐานข้อมูลตัวอย่างAdventureWorksซึ่งส่งคืนชื่อของผลิตภัณฑ์ที่ได้รับ ID:
CREATE FUNCTION dbo.DumbNameLookup
(
@ProductID integer
)
RETURNS dbo.Name
AS
BEGIN
RETURN
(
SELECT
p.Name
FROM Production.Product AS p
WHERE
p.ProductID = @ProductID
);
END;
แผนปฏิบัติการล่วงหน้า
แผนการดำเนินการล่วงหน้า (แผนโดยประมาณใน SSMS) แสดงข้อมูลแผนสำหรับคำสั่งหลักและการเรียกใช้ฟังก์ชันที่ซ้อนกัน:
-- Pre-execution plan shows main query and nested function call
SET SHOWPLAN_XML ON;
GO
SELECT dbo.DumbNameLookup(1);
GO
SET SHOWPLAN_XML OFF;
เอาท์พุท SSMS:
XML เดียวกันที่ดูในSQL Sentry Plan Explorerแสดงลักษณะซ้อนของการโทรได้ชัดเจนยิ่งขึ้น:
เอาต์พุตหลังการประมวลผล
SSMS แสดงรายละเอียดเฉพาะคิวรีหลักเมื่อมีการร้องขอเอาท์พุทแผนการดำเนินการภายหลัง:
-- Post-execution plan shows main query only
SET STATISTICS XML ON;
SELECT dbo.DumbNameLookup(1);
SET STATISTICS XML OFF;
ผลกระทบต่อประสิทธิภาพการทำงานเป็นอย่างอื่นสามารถแสดงได้โดยใช้Showplan XML Statistics Profile Event Classใน SQL Server Profiler โดยใช้แบบสอบถามที่เรียกใช้ฟังก์ชันหลายครั้ง (หนึ่งครั้งต่อแถวอินพุต):
SELECT TOP (5)
p.ProductID,
dbo.DumbNameLookup(p.ProductID)
FROM Production.Product AS p;
เอาท์พุท Profiler:
มีแผนหลังการดำเนินการแยกต่างหากห้าแผนสำหรับการดำเนินการของฟังก์ชันและอีกแผนหนึ่งสำหรับแบบสอบถามหลัก แผนห้าฟังก์ชันมีลักษณะเช่นนี้ในบานหน้าต่างด้านล่างของ profiler:
แผนแบบสอบถามหลักคือ:
การดำเนินการค้นหาโดยไม่มีส่วนTOP (5)
คำสั่งจะส่งผลในแผนการดำเนินการเต็มรูปแบบสำหรับแต่ละแถว 504 ในตารางผลิตภัณฑ์ คุณอาจจะเห็นว่าสิ่งนี้จะออกไปอย่างรวดเร็วด้วยโต๊ะขนาดใหญ่
สถานการณ์ของทริกเกอร์กลับด้าน สิ่งเหล่านี้จะไม่แสดงข้อมูลแผนการเตรียมดำเนินการใด ๆ แต่จะรวมถึงแผนการดำเนินการหลังการขาย สิ่งนี้สะท้อนถึงลักษณะของทริกเกอร์ แต่ละอันจะถูกยิงหนึ่งครั้งสำหรับทุกแถวที่ได้รับผลกระทบมากกว่าหนึ่งครั้งต่อแถว