Ngay cả sau khi vô hiệu hóa Read-Ahead và xóa bộ đệm, tại sao lại có Logical Read?


7

Tôi phải tìm tổng thời gian dành cho truy vấn để thực thi trong SQL-SERVER 2016 khi tất cả các trang dữ liệu chỉ ở trong Đĩa. Để thực hiện điều đó, tôi đã xóa tất cả các bộ đệm trong SQL-SERVER bằng các lệnh sau:

DBCC FREEPROCCACHE WITH NO_INFOMSGS
GO
DBCC DROPCLEANBUFFERS
GO
DBCC FREESESSIONCACHE
GO
DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL
GO 
DBCC FLUSHPROCINDB (@dbId)
GO

Sau này tôi lại thấy rằng các lần đọc logic đã ở đó, sau đó tôi đã biết về Đọc trước, vì vậy tôi đã vô hiệu hóa việc đọc trước bằng cờ theo dõi

DBCC TRACEON(652,-1)
GO

và cả cờ tìm nạp

DBCC TRACEON(8744,-1)
GO

Bây giờ tôi vẫn có các lần đọc logic, nhưng các lần đọc Vật lý cao hơn đáng kể so với việc chỉ xóa bộ đệm. Có cách nào để đạt được 0 lần đọc logic hay sự hiểu biết của tôi về việc đọc logic là sai?

Vui lòng hướng dẫn cho tôi, tôi mới tham gia vào thế giới SQL-SERVER

Câu trả lời:


13

Một lần đọc logic được tính khi một trang duy nhất được truy xuất từ ​​bộ đệm bộ đệm trong khi thực hiện truy vấn. Điều này được tính bất kể sử dụng vật lý hay đọc trước để lưu trang, hoặc nếu trang đã tồn tại trong bộ đệm bộ đệm. Do đó, số lần đọc logic là thước đo số lần các trang thực sự được chạm vào bộ nhớ trong khi thực hiện truy vấn.

Một lần đọc vật lý được tính khi công cụ lưu trữ đọc một hoặc nhiều trang từ bộ lưu trữ vì trang được yêu cầu chưa có trong bộ đệm. Điều này không bao gồm IO vật lý được thực hiện bằng cách quét trước.

Một lần đọc trước được tính khi công cụ lưu trữ đọc một hoặc nhiều phạm vi đầy đủ (mỗi phạm vi là 8 trang liền kề) từ bộ lưu trữ trong quá trình quét tuần tự. Đọc trước đọc dữ liệu trước vào bộ nhớ một cách mạnh mẽ để các trang có khả năng đã được lưu vào bộ nhớ cache khi cần truy vấn. Số lượng phạm vi được đọc bởi các lần quét trước đọc khác nhau tùy theo phiên bản và phiên bản SQL Server cũng như phân mảnh. Tôi đã thấy các lần quét trước đọc tới 4 MB cùng một lúc bằng cách sử dụng một IO thu thập phân tán duy nhất trong quá trình quét trong Phiên bản doanh nghiệp bằng phiên bản SQL Server mới nhất.

Lưu ý rằng công cụ lưu trữ SQL Server hoạt động khác với bộ đệm lạnh (ví dụ: sau khi khởi động lại hoặc DBCC DROPCLEANBUFFERS). Khi bộ đệm chưa được làm nóng (Trang đích của Trình quản lý bộ đệm đã đáp ứng), công cụ lưu trữ thực hiện toàn bộ mức đọc 64K thay vì đọc 8 trang duy nhất để đọc các trang vào bộ đệm. Điều này làm ấm bộ đệm nhanh hơn nhiều so với những gì khác xảy ra.

Tôi thích tập trung vào việc đọc logic hơn là vật lý cho mục đích truy vấn và điều chỉnh chỉ mục bởi vì đó là thước đo tốt hơn cho công việc được thực hiện bởi truy vấn. Nó chỉ là do tình cờ cho dù dữ liệu được lưu trữ hay không. Kiểm tra với bộ đệm lạnh là một thước đo hiệu suất lưu trữ hơn hiệu năng truy vấn, IMHO và không đại diện cho những gì sẽ xảy ra trong một khối lượng công việc sản xuất với bộ đệm ấm.


7

Sẽ luôn có những bài đọc hợp lý. SQL Server không bao giờ trả lại dữ liệu cho bạn trực tiếp từ đĩa. Nếu trang bạn cần đã có trong vùng đệm, có một lần đọc logic. Nếu không, nó sẽ được chuyển vào vùng đệm, và sau đó cũng có một lần đọc logic. Bạn sẽ luôn nhận được đọc đến từ bộ đệm.

Ngoài ra, tôi không hiểu điểm của bài kiểm tra của bạn. Có phải chỉ là phân tích ngày tận thế? Nếu bạn chỉ đơn giản là đo thời gian để trả về dữ liệu khi bắt đầu từ bộ đệm trống, tại sao bạn không đo thời gian? Tại sao bạn lo lắng về việc đọc logic / vật lý? Nếu bạn không tin các lệnh bạn đang phát hành xóa bộ đệm / bộ đệm của gói, bạn có thể kiểm tra những thứ đó thông qua DMV ngay trước khi đưa ra truy vấn của mình.


Cảm ơn, tôi đang phân tích mô hình chi phí, của nhiều DB khác nhau và tôi muốn chỉ có Đĩa I / O
Nawap

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.