แผนการดำเนินการ vs ข้อมูลสถิติ IO


20

แผนการดำเนินการกราฟิก SQL Server อ่านจากขวาไปซ้ายและบนลงล่าง มีคำสั่งที่มีความหมายต่อเอาต์พุตที่สร้างขึ้นโดยSET STATISTICS IO ON?

แบบสอบถามต่อไปนี้:

SET STATISTICS IO ON;

SELECT  *
FROM    Sales.SalesOrderHeader AS soh
        JOIN Sales.SalesOrderDetail AS sod ON soh.SalesOrderID = sod.SalesOrderID
        JOIN Production.Product AS p ON sod.ProductID = p.ProductID;

สร้างแผนนี้:

แผนการดำเนินการกราฟิก

และSTATISTICS IOผลลัพธ์นี้:

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderDetail'. Scan count 1, logical reads 1246, physical reads 3, read-ahead reads 1277, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderHeader'. Scan count 1, logical reads 689, physical reads 1, read-ahead reads 685, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Product'. Scan count 1, logical reads 15, physical reads 1, read-ahead reads 14, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

ดังนั้นฉันย้ำ: สิ่งที่ให้? มีการสั่งซื้อที่มีความหมายในการSTATISTICS IOส่งออกหรือมีการใช้คำสั่งบางอย่าง?

คำตอบ:


9

การเล่นครั้งแรกของฉันโดยใช้คำสั่งต่าง ๆ ไม่แนะนำรูปแบบใด ๆ แต่ให้ความสนใจอย่างใกล้ชิดดูเหมือนว่าสามารถคาดเดาได้สำหรับแผนอนุกรม ฉันลงเอยที่KB314648ซึ่ง @AustinZellner พูดถึง:

การเชื่อมต่อ SQL Server แต่ละครั้งมีโครงสร้างสถานะกระบวนการที่เกี่ยวข้อง (PSS) ที่เก็บรักษาข้อมูลสถานะการเชื่อมต่อเฉพาะ แต่ละ ID กระบวนการเซิร์ฟเวอร์ที่ไม่ซ้ำกัน (SPID) ในตารางระบบ sysprocesses แสดงถึง PSS ที่แตกต่างกันและข้อมูลในตารางเสมือน sysprocesses คือ "มุมมอง" ในข้อมูลสถานะนี้

และส่วนที่เกี่ยวข้องกับคำถามของคุณ:

ถ้าเปิดใช้งานสถิติ IO สำหรับการเชื่อมต่อ SQL Server จะจัดสรรอาร์เรย์ระหว่างการดำเนินการค้นหาเพื่อติดตามข้อมูล IO ตามตารางต่อตาราง ในขณะที่ SQL Server ประมวลผลแบบสอบถามจะบันทึกคำขอตรรกะแต่ละหน้าในรายการตารางที่เหมาะสมในอาร์เรย์นี้พร้อมกับว่าคำขอตรรกะ IO นั้นส่งผลให้เกิด IO ทางกายภาพ SQL Server ส่งคืนข้อมูลในตอนท้ายของแบบสอบถามในข้อความแสดงข้อผิดพลาด 3615

พฤติกรรมที่สังเกตเห็นแสดงให้เห็นว่ารายการที่ทำกับอาร์เรย์ในลำดับที่ IO สร้างขึ้นเป็นหลักผลของ GetNext () ในผู้ประกอบการทางกายภาพ รายการสุดท้ายในเอาต์พุตสถิติคือตารางแรกที่ทำให้เกิดการบันทึก IO รายการแรกคือตารางสุดท้าย ฉันคาดการณ์ว่าคำสั่งสำหรับแผนคู่ขนานนั้นไม่สามารถคาดเดาได้ (หรือน้อยกว่านั้น) เนื่องจากไม่มีการรับประกันว่าจะมีการจัดตารางงานแบบขนานก่อน


5

ดูเหมือนว่าฉันจะเป็นลำดับการเข้าถึงข้อมูลที่อ่านตรงข้ามในแผน แผนของคุณจะอ่านจากตารางผลิตภัณฑ์ก่อนเพื่อสร้างตารางแฮช (โต๊ะทำงาน) กว่าที่จะอ่านจาก SalesOrderHeader และฟอร์ม SalesOrderDetail รวมเข้ากับตัวดำเนินการรวมการผสาน จากนั้นโต๊ะทำงานจะถูกอ่านตั้งแต่ครั้งสุดท้ายจนถึงแฮชจับคู่แถวผลิตภัณฑ์ดั้งเดิมกับแถวจากการรวมการผสาน นั่นคือลำดับตรงข้ามที่แน่นอนซึ่งมีการระบุไว้ในผลลัพธ์สถิติของคุณ

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


ในกรณีนี้มันจะมาในลำดับที่ตรงข้ามในคนอื่นมันแตกต่างกัน ฉันสงสัยว่าไม่มีคำสั่งที่สามารถค้นพบได้หากไม่มีความรู้อย่างใกล้ชิดเกี่ยวกับเครื่องยนต์ที่ไม่ได้ให้บริการแก่สาธารณะ
Jeremiah Peschka

คุณมีตัวอย่างของที่อยู่ในลำดับที่แตกต่างกันหรือไม่?
เซบาสเตียนมีน

เลือก * จากฝ่ายขาย SalesOrderHeader เช่นเดียวกับฝ่ายขายฝ่ายขายส่วนล่างรายละเอียดเป็น sod บน soh.SalesOrderID = sod.SalesOrderID ซ้ายเข้าร่วมฝ่ายขาย -SalesPerson เป็น sp ต่อ soh.SalesPersonID = sp.BusinessEntityID ซ้ายบุคคลเข้าร่วม .BusinessEntityID เข้าร่วมการผลิตสินค้าเป็น p ใน sod.ProductID = p.ProductID;
Jeremiah Peschka

ตราบใดที่ไม่มีการขนานกันก็มีส่วนร่วมในการสังเกตของฉันถือเป็นจริง คุณสามารถเรียกใช้คิวรีของคุณด้วย TOP (100), TOP (1000) และ TOP (10,000) เพื่อดูแผนอนุกรม อย่างไรก็ตามด้วยท็อป (100000) หรือไม่มีท็อปคุณจะได้รับแผนคู่ขนานที่แตกต่างกันสองแบบและการเดิมพันทั้งหมดดูเหมือนจะปิด
เซบาสเตียนมีน

3

ฉันมักจะคิดว่ามันมีคำสั่งตั้งแต่หลังเมื่อฉันเขียนโปรแกรมมากกว่าการบริหาร ฉันวิ่งผ่านแผนปฏิบัติการสองสามข้อและตรวจสอบความเชื่อของฉันอีกครั้ง

นี่คือสิ่งที่ฉันเห็น:

ในแบบสอบถามแบบหลายขั้นตอน (เช่นขั้นตอนการจัดเก็บจำนวนมากของเรา) ลำดับจะแสดงลำดับทางกายภาพที่มีการเรียกใช้คิวรี

สำหรับข้อความค้นหาเฉพาะดูเหมือนว่าสถิติ IO แสดงแผนการดำเนินการโดยการรายงานสถิติที่เริ่มต้นจากด้านขวาและทำงานไปทางซ้าย

บางทีนี่อาจเป็นข้อสังเกตมากกว่าสิ่งอื่นใด


2
อาจเป็นอะไรก็ได้ในเรื่องนี้ การกลับคำสั่งของตารางในการSELECT COUNT(*) FROM HumanResources.EmployeeDepartmentHistory UNION ALL SELECT COUNT(*) FROM HumanResources.Employee UNION ALL SELECT COUNT(*) FROM HumanResources.Departmentย้อนกลับIOผลลัพธ์ แต่มันไม่ได้อธิบายว่าเหตุใดจึงมีการรายงานตารางงานก่อนในตัวอย่างในคำถาม
Martin Smith

@MartinSmith ใช่โต๊ะทำงานเป็นไวด์การ์ดจากมุมมองที่ จำกัด ของฉัน
RLF

0

ดังนั้นฉันคิดว่าผลลัพธ์ของสถิติ io ให้ข้อมูลเชิงลึกเกี่ยวกับสิ่งที่เกิดขึ้นจริงในรันไทม์เนื่องจากจะคำนึงถึงและได้รับผลกระทบจากความจำเป็นในการอ่านจากดิสก์แทนที่จะเป็นแคชและยังได้รับอิทธิพลจากสิทธิ์ของบัญชี ว่าแบบสอบถามกำลังถูกเรียกใช้ภายใต้ ตำแหน่งของตารางในผลตอบแทนทางสถิตินั้นจะได้รับอิทธิพลจากปัจจัยอื่นนอกเหนือจากที่พิจารณาโดยผู้สร้างโปรไฟล์

นี่คือบทความ kb ที่ให้ข้อมูลเชิงลึกและตัวอย่าง: http://support.microsoft.com/kb/314648


1
คำถามไม่ได้เกี่ยวกับผลลัพธ์ของSTATISTICS IOโดยทั่วไป เป็นเรื่องเกี่ยวกับลำดับที่รายงานการอ่านตารางต่างๆ ฉันไม่เห็นอะไรเกี่ยวกับสิ่งนี้ในลิงก์ของคุณ
Martin Smith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.