2010-03-15 28 views
7

Khi đo hiệu suất trên truy vấn của tôi, tôi đã đưa ra một sự phụ thuộc giữa mức độ cách ly và thời gian trôi qua mà là đáng ngạc nhiên đối với tôiTại sao mức độ cách ly tốt hơn có nghĩa là hiệu suất tốt hơn trong SQL Server

READUNCOMMITTED - 409024 
READCOMMITTED - 368021 
REPEATABLEREAD - 358019 
SERIALIZABLE - 348019 

cột trái là bảng gợi ý, và cột bên phải là thời gian trôi qua tính bằng micro giây (sys.dm_exec_query_stats.total_elapsed_time). Tại sao mức độ cách ly tốt hơn cho hiệu suất tốt hơn? Đây là một máy phát triển và không có sự tương tranh nào xảy ra. Tôi mong đợi READUNCOMMITTED sẽ được nhịn ăn do ít chi phí khóa hơn.

Cập nhật: Tôi đã đo này với

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 

ban hành và Profiler khẳng định có đang có bộ nhớ cache hit xảy ra.

+0

Tôi chắc chắn có thói quen như vậy, cảm ơn lời nhắc nhở. Remus đã cung cấp một đầu vào khá có giá trị mặc dù tôi vẫn hy vọng sẽ có được một cái nhìn sâu sắc tại sao hiện tượng tôi quan sát xảy ra. –

Trả lời

4

Trước hết, bạn cần chạy truy vấn nhiều lần theo từng mức cách ly và trung bình kết quả, loại bỏ truy vấn có thời gian tối đa. Điều này sẽ loại bỏ tác động của bộ đệm ấm lên: bạn muốn tất cả chạy trên bộ nhớ đệm ấm, không có một truy vấn nào làm ấm bộ nhớ cache và trả tiền phạt trong so sánh.

Tiếp theo, bạn cần đảm bảo rằng bạn đo lường theo kịch bản đồng thời thực tế. NẾU bạn sẽ có cập nhật/chèn/xóa xảy ra trong cuộc sống thực, sau đó bạn phải thêm chúng vào thử nghiệm của bạn, vì chúng sẽ tác động đến cực kỳ số lần đọc theo mức độ cách ly khác nhau. Điều cuối cùng bạn muốn là để kết luận 'đọc tuần tự là nhanh nhất, cho phép sử dụng chúng ở khắp mọi nơi' và sau đó xem hệ thống tan chảy trong sản xuất bởi vì tất cả mọi thứ được đăng.

Ngoài ra, mức độ cách ly duy nhất nhanh hơn hợp pháp là đọc bẩn, vì nó không có khóa. Đọc ảnh chụp đã cam kết (mà bạn không đo) cũng không có khóa, nhưng nó ảnh hưởng đến hiệu suất tổng thể do phí trên đầu phiên bản hàng.

+0

Vui lòng tìm các cập nhật cho câu hỏi của tôi để giải quyết một số điểm trong phản hồi của bạn. Bởi "đọc bẩn", bạn có nghĩa là ĐÃ ĐỌC, phải không? –

+0

1) Chạy truy vấn trên bộ nhớ cache lạnh không chính xác. Các truy vấn sản xuất của bạn sẽ không chạy trên bộ nhớ cache lạnh, bạn sẽ tối ưu hóa một kịch bản không thực tế và bạn không đo được truy vấn, bạn thực sự đo lường thông lượng đọc đĩa. Bạn cũng cần đo hiệu suất trên bộ nhớ đệm ấm và theo dõi cả hai (thời gian chạy nguội, thời gian chạy ấm). 2) đọc bẩn được đọc không cam kết. –

+0

Mức độ liên quan của bộ nhớ cache cho truy vấn lớn (hàng triệu hàng) trong các trường hợp bình thường chỉ chạy một lần cho dữ liệu cụ thể là bao nhiêu? –

0

Bây giờ tôi hiểu các mức cách ly tốt hơn, tôi thấy rằng mức cô lập tốt hơn có thể cho phép một số tối ưu hóa thông minh. Ví dụ, một khi giao dịch đọc một số mức cô lập dữ liệu có thể quy định nó nên được sử dụng dữ liệu đó cho đến cuối thay vì cố gắng đọc lại chúng từ đĩa.

Tôi vẫn muốn đọc một số chi tiết chuyên sâu về điều này.

Các vấn đề liên quan