Kế hoạch thực hiện so với THỐNG KÊ thứ tự IO


20

Các kế hoạch thực hiện đồ họa của SQL Server đọc từ phải sang trái và từ trên xuống dưới. Có một thứ tự có ý nghĩa cho đầu ra được tạo ra bởi SET STATISTICS IO ON?

Truy vấn sau đây:

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;

Tạo kế hoạch này:

Kế hoạch thực hiện đồ họa

STATISTICS IOđầu ra này :

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.

Vì vậy, tôi nhắc lại: những gì cho? Có một thứ tự có ý nghĩa để STATISTICS IOđầu ra hoặc một số thứ tự tùy ý được sử dụng?

Câu trả lời:


9

Việc chơi ban đầu của tôi xung quanh với các truy vấn khác nhau cho thấy không có mô hình nào cả nhưng khi chú ý kỹ hơn, dường như có thể dự đoán được cho các kế hoạch nối tiếp. Tôi đã kết thúc tại KB314648 mà @AustinZellner đề cập:

Mỗi kết nối Máy chủ SQL có cấu trúc trạng thái quy trình liên quan (PSS) duy trì thông tin trạng thái cụ thể của kết nối. Mỗi ID tiến trình máy chủ duy nhất (SPID) trong bảng hệ thống sys Processes đại diện cho một PSS khác nhau và thông tin trong bảng ảo sys Processes là "xem" thông tin trạng thái này.

Và phần liên quan đến câu hỏi của bạn:

Nếu STATISTICS IO được bật cho kết nối, SQL Server sẽ cấp phát một mảng trong khi thực hiện truy vấn để theo dõi thông tin IO trên cơ sở mỗi bảng. Khi SQL Server xử lý truy vấn, nó ghi lại từng yêu cầu logic cho một trang trong mục nhập của bảng thích hợp trong mảng này, cùng với việc yêu cầu IO logic đó có dẫn đến IO vật lý hay không. SQL Server trả về thông tin, ở cuối truy vấn, trong thông báo lỗi 3615.

Hành vi được quan sát cho thấy rằng các mục được tạo cho mảng theo thứ tự IO được tạo, về cơ bản là kết quả của GetNext () trên một toán tử vật lý. Mục cuối cùng trong đầu ra thống kê là bảng đầu tiên dẫn đến IO được ghi lại, mục đầu tiên là bảng cuối cùng. Tôi đoán rằng thứ tự cho các kế hoạch song song là không thể dự đoán được (hoặc ít hơn) vì không có gì đảm bảo rằng nhiệm vụ song song nào sẽ được lên lịch trước.


5

Có vẻ như đó là thứ tự ngược lại của việc truy cập đọc dữ liệu trong kế hoạch. Kế hoạch của bạn trước tiên sẽ đọc từ bảng Sản phẩm để xây dựng bảng băm (bàn làm việc). Hơn nó đọc từ SalesOrderHeader và hình thành SalesOrderDetail kết hợp chúng với toán tử hợp nhất. Bàn làm việc sau đó được đọc từ cuối cùng để khớp với các hàng Sản phẩm ban đầu với các hàng từ liên kết hợp nhất. Đó là thứ tự ngược lại chính xác trong đó chúng được liệt kê trong đầu ra thống kê của bạn.

Tuy nhiên, tôi không biết bất kỳ tài liệu nào sẽ chỉ định điều này. Nếu bạn muốn chắc chắn về việc truy cập bảng thứ tự nào đã xảy ra, hãy đọc kế hoạch thực hiện.


Trong trường hợp này, nó đi qua một thứ tự ngược lại, trong những trường hợp khác, nó khác. Tôi nghi ngờ rằng không có thứ tự nào có thể khám phá được nếu không có kiến ​​thức sâu sắc về động cơ thường không có sẵn cho công chúng.
Jeremiah Peschka

Bạn có một ví dụ về nơi nó ở trong một thứ tự khác nhau?
Sebastian Meine

CHỌN * TỪ Doanh số.SalesOrderHeader AS soh THAM GIA Doanh số .BusinessEntityID THAM GIA Sản xuất. Sản phẩm NHƯ p TRÊN sod. ProducttID = p. ProducttID;
Jeremiah Peschka

Miễn là không có sự song song có liên quan đến quan sát của tôi là đúng. Bạn có thể chạy truy vấn của mình với TOP (100), TOP (1000) và TOP (10000) để xem các gói nối tiếp. Tuy nhiên, với TOP (100000) hoặc không có TOP, bạn có hai kế hoạch song song khác nhau và tất cả các cược dường như bị tắt.
Sebastian Meine

3

Tôi luôn nghĩ rằng nó đã có một trật tự, từ khi tôi làm lập trình nhiều hơn là quản trị. Tôi đã chạy qua một vài kế hoạch thực hiện và kiểm tra lại niềm tin của mình.

Đây là những gì tôi thấy:

Trong truy vấn nhiều bước (chẳng hạn như nhiều quy trình được lưu trữ của chúng tôi), thứ tự phản ánh thứ tự vật lý trong đó các truy vấn được chạy.

Đối với một truy vấn cụ thể, có vẻ như số liệu thống kê IO phản ánh kế hoạch thực hiện bằng cách báo cáo số liệu thống kê bắt đầu từ bên phải và hoạt động ở bên trái

Có lẽ đây là một quan sát nhiều hơn bất cứ điều gì khác.


2
Có thể là một cái gì đó trong này. Đảo ngược thứ tự của các bảng trong SELECT COUNT(*) FROM HumanResources.EmployeeDepartmentHistory UNION ALL SELECT COUNT(*) FROM HumanResources.Employee UNION ALL SELECT COUNT(*) FROM HumanResources.Departmentcũng đảo ngược IOđầu ra nhưng nó không giải thích tại sao bảng làm việc được báo cáo đầu tiên trong ví dụ trong câu hỏi.
Martin Smith

@MartinSmith Vâng, bàn làm việc là một thẻ hoang dã theo quan điểm hạn chế của tôi.
RLF

0

Vì vậy, tôi nghĩ rằng kết quả thống kê io cung cấp cái nhìn sâu sắc hơn nhiều về những gì thực sự xảy ra trong thời gian chạy, vì nó sẽ được tính đến và bị ảnh hưởng bởi nhu cầu đọc từ đĩa thay vì bộ đệm và cũng bị ảnh hưởng bởi quyền của tài khoản truy vấn đang được chạy theo. Vị trí của bảng trong bảng thống kê trở lại sau đó bị ảnh hưởng bởi các yếu tố khác ngoài các yếu tố được xem xét bởi trình lược tả.

Dưới đây là một bài viết kb cung cấp cái nhìn sâu sắc và một số ví dụ: http://support.microsoft.com/kb/314648


1
Câu hỏi không phải là về đầu ra STATISTICS IOnói chung. Nó hoàn toàn là về thứ tự mà các lần đọc của các bảng khác nhau được báo cáo. Tôi không thấy bất cứ điều gì về điều này trong liên kết của bạn.
Martin Smith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.