Tại sao phải mất quá nhiều thời gian để tính toán Kế hoạch thực hiện?


9

Một trong những khách hàng của chúng tôi vừa nâng cấp lên một máy chủ mới.

Đối với một thủ tục được lưu trữ cụ thể vào lần đầu tiên bạn thực hiện nó, sẽ mất hơn ba phút để chạy. Các lần chạy tiếp theo là ít hơn 1 giây.

Điều này khiến tôi tin rằng ba phút ban đầu chủ yếu được đưa lên để tính toán kế hoạch thực hiện. Các lần chạy tiếp theo sau đó chỉ cần sử dụng gói bộ nhớ cache và chạy ngay lập tức.

Trên cơ sở dữ liệu thử nghiệm của chúng tôi, sẽ mất khoảng 5 giây để tính toán kế hoạch cho cùng một quy trình.

Tôi không thấy bất cứ điều gì khủng khiếp trong bản thân kế hoạch - mặc dù tôi không tưởng tượng được nó có liên quan vì kế hoạch cho thấy mất bao lâu để chạy truy vấn, không tự tính toán.

Máy chủ là một lõi 16 với bộ nhớ 24 gb. Không có CPU nặng hoặc tải bộ nhớ xảy ra.

Cái gì có thể gây ra một phép tính chậm như vậy chỉ trên một cơ sở dữ liệu cụ thể?

Những bước tôi có thể thực hiện để tìm ra nguyên nhân của vấn đề?

Biên tập

Vì vậy, tôi đã quản lý để truy cập vào máy chủ và đã chạy truy vấn với SET SHOWPLAN_XML ON .

Tôi có thể xác nhận rằng CompileTime cho truy vấn đang chiếm 99% thời gian thực hiện truy vấn. Các StatementOptmEarlyAbortReason"TimeOut" , trên cơ sở dữ liệu thử nghiệm của chúng tôi với một bản sao của cơ sở dữ liệu của họ lý do được MemoryLimitExceeded.


1
Bạn có chắc rằng quá trình biên dịch kế hoạch của nó mất nhiều thời gian, không chỉ đọc dữ liệu vào bộ đệm từ đĩa?
Mark Storey-Smith

1
Thời gian biên dịch hiển thị trong chính kế hoạch XML. Bạn đã xác định nó chắc chắn là thời gian biên dịch và không phải thứ gì khác, ví dụ như cập nhật thống kê tự động đồng bộ? Bạn đang dùng phiên bản SQL Server nào?
Martin Smith

@ MarkStorey-Smith Tôi không thực sự chắc chắn về bất cứ điều gì. Tôi biết rằng việc chạy DBCC FREEPROCCACHE , chỉ xóa bộ nhớ cache của gói, sẽ mất thời gian truy vấn tiếp theo tối đa 3 phút.
Mongus Pong

@MartinSmith À đúng rồi, tôi đã sử dụng gói truy vấn trực quan. Có, thời gian biên dịch gần bằng toàn bộ thời gian thực hiện của truy vấn. Chúng tôi đang trên SQL Server 2008 R2.
Mongus Pong

@MongusPong - Nếu bạn tạo một số liệu thống kê chỉ sao chép cơ sở dữ liệu sản xuất, bạn có thể sao chép điều này trong môi trường thử nghiệm của mình không? Kế hoạch nói lên điều StatementOptmEarlyAbortReasongì?
Martin Smith

Câu trả lời:


9

Tôi ghét phải trả lời câu hỏi của riêng tôi, đặc biệt là vì tôi đã có rất nhiều sự giúp đỡ từ những người khác để đưa ra giải pháp, nhưng rồi đây.

Vấn đề là do một số thống kê dud trong cơ sở dữ liệu. Nhìn vào kế hoạch thực hiện, trình tối ưu hóa đã mong đợi 11,5tb dữ liệu được trả về từ truy vấn. Trong thực tế đã nhận được 87kb. Bây giờ tôi biết rằng sự không phù hợp lớn giữa các hàng dự kiến ​​và thực tế được trả về là một dấu hiệu cho thấy các số liệu thống kê đã lỗi thời.

Đơn giản là chạy

exec sp_updatestats

buộc cơ sở dữ liệu cập nhật số liệu thống kê cho tất cả các bảng.

Điều này đã khiến thời gian thực hiện truy vấn giảm từ 3 phút xuống còn 6 giây. Mỗi người một người chiến thắng!

Cảm ơn vì sự giúp đỡ của các bạn. : 0)

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.