Bạn có thể sử dụng một trong hai truy vấn này để xem tổng số lần đọc logic và tổng số lần đọc vật lý.
SELECT DB_NAME(st.dbid) Db,
OBJECT_NAME(st.objectid, st.dbid) Prc,
qs.execution_count,
qs.total_logical_reads,
qs.total_physical_reads,
qs.statement_start_offset,
qs.statement_end_offset,
st.text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st;
SELECT DB_NAME(database_id) Db,
OBJECT_NAME(object_id, database_id) Prc,
execution_count,
total_logical_reads,
total_physical_reads
FROM sys.dm_exec_procedure_stats ps;
Cái đầu tiên phá vỡ điều này bằng câu lệnh, cái thứ hai tính trong toàn bộ thủ tục.
Đọc vật lý là đọc trên đĩa, đọc hợp lý là chống lại bộ nhớ. Bạn có thể sử dụng điều này để tìm ra các thủ tục hoặc câu lệnh nào là đắt nhất trong hệ thống của bạn và cố gắng điều chỉnh chúng.
Hãy nhớ rằng, mặc dù các lần đọc logic rẻ hơn đáng kể so với đọc vật lý, chúng vẫn đắt tiền, do đó việc giảm số lượng chúng (ví dụ bằng cách thêm một chỉ mục thích hợp) có thể khiến truy vấn của bạn chạy nhanh hơn rất nhiều.
Có rất nhiều cột bổ sung trong DMV ở trên mà bạn cũng có thể thấy thú vị.
Làm thế nào để một chỉ số giúp giảm đọc hợp lý?
Trong SQL Server, tất cả dữ liệu được sắp xếp theo khối, kích thước 8KB. Những khối này được gọi là "trang".
Mỗi bảng chứa các trang "meta" có chứa thông tin về struktur của bảng cũng như các trang pata. Nếu không có chỉ mục nào tồn tại và bạn chạy một truy vấn như SELECT * FROM tbl WHERE Id = 7
SQL Server phải tìm kiếm hàng này hoặc các hàng này trong toàn bộ bảng. Vì vậy, nó đọc trong một trang tại một thời điểm, lặp qua tất cả các hàng trong mỗi trang để xác định các hàng phù hợp với WHERE
mệnh đề. Vì vậy, nếu bảng yêu cầu 1.000.000 trang được lưu trữ, truy vấn này sẽ mất 1.000.000 lần đọc logic để thực thi.
Nếu bạn có một chỉ mục, SQL Server sẽ sắp xếp dữ liệu một cách hợp lý trong các trang và thiết lập một danh sách được liên kết giữa các trang. Điều này cho phép chạy các truy vấn với một ORDER BY
thực thi mà không cần một hoạt động sắp xếp đắt tiền. Nhưng quan trọng là việc sắp xếp, SQL Server thêm Cây B + vào bảng. Cây B + là một cấu trúc có thể so sánh với chỉ mục trong một cuốn sách, trong đó việc tìm kiếm một từ khóa cụ thể cho phép tôi trực tiếp nhảy đến trang có chứa từ khóa. Cuốn sách điển hình chỉ có một cấp chỉ mục trong khi Cây B + có thể có nhiều cấp. Chỉ cần nghĩ về một cuốn sách lớn, trong đó bản thân chỉ mục dài nhiều trang. Trong trường hợp như vậy, điều hợp lý là thêm một lớp chỉ mục bổ sung cho chúng ta biết trên trang wich, các từ chỉ mục bắt đầu bằng S
sẽ được tìm thấy.
B + Cây được tối ưu hóa để có càng ít cấp càng tốt trong khi cung cấp thuộc tính mà bất kỳ bản ghi nào trong chỉ mục có thể được tìm thấy bằng cách đọc một trang trên mỗi cấp chỉ mục. Vì vậy, giả sử WHERE Id = 7
truy vấn trên khi bạn có một chỉ mục được sắp xếp theo Id
. Hãy nói rằng chỉ số có 5 cấp độ. Bây giờ, để tìm tất cả các bản ghi khớp với truy vấn này, tôi phải đọc một trang cho mỗi cấp chỉ mục (đó là 5 trang). Đây được gọi là "Tìm kiếm chỉ mục". Nếu có nhiều bản ghi phù hợp với hóa đơn, tôi có thể phải theo chỉ mục được sắp xếp trong một thời gian để lấy tất cả chúng. Nhưng hãy giả sử chỉ có một bản ghi.
Vì vậy, không có chỉ mục chạy mà truy vấn đó yêu cầu 1.000.000 lượt đọc, với chỉ số yêu cầu 5 lần đọc. Mặc dù một lần đọc logic là một hoạt động trong bộ nhớ, vẫn có một chi phí đáng kể - thực tế nó là hoạt động tốn kém nhất trong một truy vấn tầm thường như ở trên. Vì vậy, việc giảm số lần đọc logic cần thiết cho hệ số 200.000 sẽ tăng tốc truy vấn của bạn bằng một yếu tố tương tự.
Vì vậy, một lần đọc logic không tương đương với quét bảng, nhưng quét bảng gây ra nhiều lần đọc logic hơn so với tìm kiếm chỉ mục.