โดยประมาณกับแผนแบบสอบถามจริงกับการเรียกใช้ฟังก์ชัน


11

ฉันมีแบบสอบถามนี้ในเซิร์ฟเวอร์ SQL แบบสอบถามจำลองแบบผสาน:

SELECT DISTINCT
    b.tablenick,
    b.rowguid,
    c.generation,
    sys.fn_MSgeneration_downloadonly
    (
        c.generation,
        c.tablenick
    )
FROM #belong b
LEFT OUTER JOIN dbo.MSmerge_contents c ON 
    c.tablenick = b.tablenick
    AND c.rowguid = b.rowguid;

แผนแบบสอบถามโดยประมาณมีข้อมูลเกี่ยวกับ 3 แบบสอบถาม

  1. แบบสอบถามข้างต้น
  2. การเรียกใช้ฟังก์ชันเพื่อ fn_MSgeneration_download เท่านั้น
  3. การเรียกใช้ฟังก์ชันเพื่อ fn_MSArticle_has_downloadonly_property

แผนแบบสอบถามจริงรวมเฉพาะข้อมูลนี้:

  1. แบบสอบถามข้างต้น

ไม่มีอะไรเกี่ยวกับฟังก์ชั่น เหตุใดข้อมูลฟังก์ชันจึงขาดหายไปในแผนจริง

ฉันลองตัวเลือกเหล่านี้:

SET STATISTICS PROFILE ON
SET STATISTICS XML ON

ซึ่งสร้างแผนจริง แต่ขาดส่วนที่ 2 และ 3 เหมือนกับเมื่อฉันใช้ตัวเลือกแผนแบบสอบถามจริงใน Management Studio

ถ้าเช่นฉันจะใช้ Profiler เพื่อรวบรวมข้อมูลเกี่ยวกับฟังก์ชั่นเรียกเหตุการณ์ที่ฉันจะเลือก?


ไม่พบคำตอบที่เกี่ยวข้องกับแผนแบบสอบถามโดยเฉพาะ แต่ฉันทำโปรไฟล์ SP: StmtStarting และ SP: StmtCompleted และแสดงการเรียกใช้ฟังก์ชัน

คำตอบ:


17

และไม่มีอะไรเกี่ยวกับฟังก์ชั่น เหตุใดข้อมูลฟังก์ชันจึงขาดหายไปในแผนจริง

นี่คือการออกแบบด้วยเหตุผลด้านประสิทธิภาพ

ฟังก์ชันที่มี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:

แผนการดำเนินการล่วงหน้า SSMS

XML เดียวกันที่ดูในSQL Sentry Plan Explorerแสดงลักษณะซ้อนของการโทรได้ชัดเจนยิ่งขึ้น:

แผนปฏิบัติการล่วงหน้า PE

เอาต์พุตหลังการประมวลผล

SSMS แสดงรายละเอียดเฉพาะคิวรีหลักเมื่อมีการร้องขอเอาท์พุทแผนการดำเนินการภายหลัง:

-- Post-execution plan shows main query only
SET STATISTICS XML ON;
SELECT dbo.DumbNameLookup(1);
SET STATISTICS XML OFF;

การดำเนินการ SSMS

ผลกระทบต่อประสิทธิภาพการทำงานเป็นอย่างอื่นสามารถแสดงได้โดยใช้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 ในตารางผลิตภัณฑ์ คุณอาจจะเห็นว่าสิ่งนี้จะออกไปอย่างรวดเร็วด้วยโต๊ะขนาดใหญ่

สถานการณ์ของทริกเกอร์กลับด้าน สิ่งเหล่านี้จะไม่แสดงข้อมูลแผนการเตรียมดำเนินการใด ๆ แต่จะรวมถึงแผนการดำเนินการหลังการขาย สิ่งนี้สะท้อนถึงลักษณะของทริกเกอร์ แต่ละอันจะถูกยิงหนึ่งครั้งสำหรับทุกแถวที่ได้รับผลกระทบมากกว่าหนึ่งครั้งต่อแถว


@PaulWhite มีเหตุผลที่ดีที่แผนทริกเกอร์ไม่แสดงเมื่อร้องขอแผนการดำเนินการโดยประมาณหรือไม่ ดูเหมือนว่าคุณสมบัติที่ขาดหายไปมีประโยชน์ ฉันอาจสร้างรายการเชื่อมต่อสำหรับมัน
usr

@usr - อาจเป็นเพราะแผนแคชจริงที่เลือกอาจแตกต่างกันไปขึ้นอยู่กับจำนวนแถวจริงตามที่อธิบายไว้ที่นี่? technet.microsoft.com/en-us/library/…
Martin Smith

@MartinSmith นั่นอาจเป็นเหตุผล เมื่อเร็ว ๆ นี้รายการเชื่อมต่อสำหรับแผนการดำเนินการของการตรวจสอบและข้อ จำกัด fk ถูกทำเครื่องหมายว่าเสร็จสมบูรณ์ดังนั้นฉันหวังว่าพวกเขาจะทำสิ่งเดียวกันกับทริกเกอร์
usr

@usr - อันนี้ที่นี่ ? 3 เดือน? นั่นจะต้องเป็นบันทึกสำหรับคำขอคุณสมบัติใหม่!
Martin Smith

@ MartinSmith ใช่แล้ว มันเป็น "แก้ไข" 1-2 เมื่อก่อน ฉันหวังว่าฉันจะได้ไม่ต้องไปสอบถามที่เก็บแบบสอบถาม ฉันหวังว่าจะคลิกปุ่มใน SSMS ที่จริงแล้วฉันรู้สึกประหลาดใจที่เห็นการเปลี่ยนแปลงใด ๆ กับเครื่องยนต์ที่ไม่ได้สัมผัสมานานหลายปี แต่อาจจะไม่มี
usr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.