Sau khi tạo cơ sở dữ liệu tpch trong SQL Server của tôi, tôi đã thử truy vấn bên dưới:
set statistics io on
DBCC DROPCLEANBUFFERS;
select top 100 * from dbo.lineitem order by l_partkey;
Dòng bảng có một chỉ mục không được nhóm trên l_partkey. Tôi đã đưa ra các truy vấn trên một vài lần và phát hiện ra rằng các lần đọc logic khác nhau mỗi lần:
Table 'lineitem'. Scan count 1, logical reads 1019, physical reads 4, read-ahead reads 1760, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'lineitem'. Scan count 1, logical reads 1007, physical reads 4, read-ahead reads 1720, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'lineitem'. Scan count 1, logical reads 1030, physical reads 4, read-ahead reads 1792, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Từ bài đăng ở đây: Số lượng đọc hợp lý khác nhau , tôi biết nó có thể được gây ra bởi hành vi đọc trước.
NHƯNG chính xác tại sao đọc trước có thể gây ra đọc hợp lý hơn? Làm thế nào để nó thay đổi hành vi SQL Server? Giống như SQL Server có thể đọc thêm trang chỉ mục vì dù sao nó cũng nằm trong bộ đệm?
Dù sao, tôi đã vô hiệu hóa đọc trước và đưa ra truy vấn trên. Bây giờ nó báo cáo cùng một số lần đọc logic mỗi lần. NHƯNG các lần đọc logic nhỏ hơn nhiều !!
Table 'lineitem'. Scan count 1, logical reads 404, physical reads 160, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Vì vậy, câu hỏi của tôi là, tại sao tính năng đọc trước có thể gây ra nhiều số lần đọc logic hơn và khác nhau?
Vì tò mò, tôi đã thử một truy vấn khác mà không có "order by":
select top 100 * from dbo.lineitem
Đây là kết quả mà không cần đọc trước:
Table 'lineitem'. Scan count 1, logical reads 5, physical reads 3, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Đây là kết quả với đọc trước:
Table 'lineitem'. Scan count 1, logical reads 15, physical reads 2, read-ahead reads 3416, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Người đọc trước vẫn có cách đọc hợp lý hơn. Vậy tại sao?