Tại sao các truy vấn gây ra sự cố tràn sang tempdb?


27

Lý lịch

Tôi đang trong quá trình di chuyển cơ sở dữ liệu 160gb từ MSSQL 2008 (tiêu chuẩn) trên máy chủ Win 2008 với RAM 48gb sang máy chủ mới chạy MSSQL 2012 (phiên bản web 64 bit) trên Win 2012 với 64gb RAM. Máy chủ cũ đang hoạt động và đang tải; máy chủ mới không được sản xuất. Máy chủ mới có 8 tệp tempdb (mỗi tệp 4GB).

Vấn đề

Khi thử nghiệm trên máy chủ mới, tôi thấy các bước trong nhiều truy vấn gây ra cảnh báo đề cập đến "toán tử đã sử dụng tempdb để làm đổ dữ liệu trong khi thực thi". Tôi đã có thể tránh các loại bằng cách viết lại một số truy vấn, nhưng điều này không thực sự giải quyết vấn đề. Các truy vấn tương tự trên máy chủ cũ không gây ra sự cố tràn. Tôi đã đọc được rằng sự cố tràn xảy ra khi MSSQL không thể hoàn thành một thao tác trong bộ nhớ và phải tràn / trang vào tempdb. Tôi có nên lo lắng về sự cố tràn?

Ví dụ

nhập mô tả hình ảnh ở đây

Tôi đã chạy sp_updatestats trên cơ sở dữ liệu, vì vậy số liệu thống kê phải được cập nhật, nhưng bạn sẽ lưu ý rằng có một số khác biệt giữa số lượng hàng ước tính và thực tế.

Bộ nhớ

Tôi đã đặt cài đặt bộ nhớ tối đa cho MSSQL là 58 trên 64gb. Hiện tại MSSQL đã tiêu thụ khoảng 35gb bộ nhớ này, nhưng có bộ chỉ hoạt động 682mb. Máy chủ cũ (mặc dù trong sản xuất, xử lý tải) có 44gb bộ nhớ được cam kết với MSSQL, trong đó 43,5gb trong bộ làm việc của nó.

nhập mô tả hình ảnh ở đây

Tôi không biết liệu sự cố tràn có thể liên quan đến cài đặt bộ nhớ hay không - có ai có ý tưởng gì không? MSSQL hiện có nhiều mẫu RAM dự phòng, vậy tại sao nó lại tràn vào tempdb cho một số loại và khớp băm?


7
Cảnh báo trong kế hoạch thực hiện là mới trong năm 2012. Bạn đã kiểm tra nó không tràn ra trên máy chủ cũ chưa? Bạn đã theo dõi cho điều này?
Martin Smith

@MartinSmith ah, không nhận ra cảnh báo là mới. Tôi đã không theo dõi sự cố tràn trên máy chủ cũ. Sẽ điều tra mà.

1
Điểm tiếp tuyến hơi nhỏ nhưng tôi đang ngồi trước một bảng 10 mà theo mặc định chủ yếu sử dụng các phép nối hợp nhất với ước tính hàng rất tốt gây ra sự cố tràn tempdb cấp 0 và thời gian chạy 25 giây. Buộc băm tham gia (và đặt hàng) sẽ loại bỏ sự cố tràn và chạy trong 9 giây. Tôi đang tự hỏi liệu sự hợp nhất của nó với băm hay sự cố tràn gây ra sự khác biệt và liệu trình tối ưu hóa có đúng trọng số hiệu quả của sự cố tràn sắp tới dường như đã biết hay không (vì ước tính hàng rất tốt).
crokusek

Máy chủ mới có numa phần cứng?
stacylaray

Câu trả lời:


28

Có một số câu hỏi khác nhau ở đây:

Q: Tại sao các truy vấn không tràn ra trước đó?

Chúng là, nhưng SQL Server Management Studio đã không coi đây là một lỗi rõ ràng trước SQL 2012. Đó là một ví dụ tuyệt vời về lý do tại sao khi bạn thực hiện điều chỉnh hiệu suất, bạn phải đi sâu hơn kế hoạch thực hiện đồ họa.

Q: Tại sao các truy vấn tràn vào đĩa?

Bởi vì SQL Server không cấp cho họ đủ bộ nhớ để hoàn thành các hoạt động của họ. Có lẽ kế hoạch thực hiện đã đánh giá thấp dung lượng bộ nhớ cần thiết hoặc có lẽ hộp bị áp lực bộ nhớ hoặc chúng chỉ là những truy vấn lớn. (Hãy nhớ rằng, SQL Server sử dụng bộ nhớ cho ba thứ - lưu trữ các trang dữ liệu thô, kế hoạch thực hiện bộ đệm và không gian làm việc cho các truy vấn. Bộ nhớ không gian làm việc đó kết thúc khá nhỏ.)

Q: Làm thế nào tôi có thể giảm sự cố tràn?

Bằng cách viết các câu lệnh T-SQL có thể mở rộng, có số liệu thống kê cập nhật, đặt đủ bộ nhớ vào máy chủ, xây dựng các chỉ mục phù hợp và diễn giải các kế hoạch thực hiện khi mọi thứ không diễn ra theo cách bạn mong đợi. Hãy xem cuốn sách Điều chỉnh hiệu suất truy vấn SQL Server của Grant Fritchey để biết giải thích chi tiết về tất cả những điều đó.

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.