Thiếu kế hoạch thực hiện cho các thủ tục được lưu trữ


12

Các lý do cho một kế hoạch bị thiếu từ bộ nhớ cache cho các thủ tục được lưu trữ là gì?

  1. WITH RECOMPILE
  2. SQL động
  3. Mã hóa
  4. Thay đổi dữ liệu quan trọng
  5. Cập nhật số liệu thống kê
  6. Còn gì nữa không

Gần đây tôi đã làm việc trên 2 máy chủ (SQL Server 2008 R2 và SQL Server 2012) gần đây không có kế hoạch trong bộ đệm cho các thủ tục lưu trữ rất tốn tài nguyên. Nhiều, có thể là tất cả, các câu lệnh bên trong các thủ tục được lưu trữ cũng không có kế hoạch trong bộ đệm. Một số thủ tục được lưu trữ thực thi khá thường xuyên như một vài lần mỗi giây.

Không có áp lực bộ nhớ nào. Một trong những máy chủ có phần cứng nhiều hơn mức cần thiết.

Tôi nghĩ rằng các gói bị thiếu là do tạo bảng tạm thời ở giữa các thủ tục được lưu trữ, nhưng dường như đó là thông tin cũ từ SQL Server 2000 hoặc trước đó. Bắt đầu với SQL Server 2005, các biên dịch lại xảy ra ở cấp độ câu lệnh cho các câu lệnh sau DDL. Điều đó có đúng trong mọi trường hợp hay nó vẫn có thể xảy ra trên các phiên bản mới hơn?

Điều gì khác có thể là thủ phạm cho các kế hoạch mất tích? Tôi đã đọc lướt qua một vài bài viết về chủ đề này, nhưng dường như không có gì phù hợp.

Tối ưu hóa cho khối lượng công việc adhoc được kích hoạt trên máy chủ tôi đang xem xét trong tuần này. Một trong những thủ tục được lưu trữ chỉ được thực hiện một lần một ngày. Tôi có mã cho cái đó. Tôi không có mã cho mã thực thi hơn 100 lần mỗi phút, nhưng tôi có thể lấy mã đó. Tôi sẽ không thể đăng mã, nhưng tôi có thể mô tả nó liên quan đến câu hỏi của tôi.

Tôi không tin bất cứ ai đang giải phóng bộ đệm thủ tục hoặc bỏ bộ đệm sạch. Khách hàng này đang sử dụng Solarwinds DPA như một trong những công cụ giám sát của họ. DPA đã nắm bắt một trong các kế hoạch thực hiện cho tuyên bố trong kho lưu trữ được gọi mỗi ngày một lần. Câu nói đó có số lượng đọc lớn do WHEREmệnh đề không thể nói được. Nếu DPA nắm bắt được tuyên bố, thì đó là một kế hoạch ước tính và đã ở trong bộ đệm của kế hoạch cùng một lúc. Chỉ là không có khi chúng tôi đang khắc phục sự cố. Tôi sẽ có họ bắt đầu đăng nhập sp_WhoIsActivevào một bảng.

Tôi đang sử dụng sp_BlitzCache. (Tôi làm việc cho Brent Ozar Unlimited) Điều này sẽ hiển thị kế hoạch cho toàn bộ thủ tục được lưu trữ cũng như các kế hoạch cho các tuyên bố riêng lẻ, nếu chúng tồn tại. Nếu chúng không tồn tại, nó có một cảnh báo "Chúng tôi không thể tìm thấy kế hoạch cho truy vấn này. Lý do có thể cho việc này bao gồm SQL động, RECOMPILEgợi ý và mã được mã hóa." Và cảnh báo đó là trên các tuyên bố quá.

TF 2371 không đúng chỗ. Tôi đang nhìn vào số liệu thống kê chờ đợi. Máy chủ khá chán. PLE là hơn 130.000.

Bây giờ tôi có mã cho 2 thủ tục lưu trữ hơn. Một trong số họ đang sử dụng SQL động exec (@sql)để người ta biết tại sao không có kế hoạch cho nó. Nhưng một cái khác, và đây là cái chạy hơn 100 lần mỗi phút, không có gì khác thường. Điều duy nhất nổi bật trong đó là các bảng tạm thời đang được tạo ở giữa hơn 1000 dòng mã. Nó cũng gọi một loạt các thủ tục lưu trữ con.

Về kế hoạch bộ nhớ đệm trong SQL Server 2008 , tôi không thấy bất kỳ chữ nào> = 8k, nhưng một trong các thủ tục được lưu trữ có một nhận xét về việc chèn hàng loạt ngay trước khi nó gọi một thủ tục được lưu trữ khác. Nhưng chèn số lượng lớn không xuất hiện trong quy trình lưu trữ bên ngoài mà tôi đang xem xét. Phần "Ngưỡng biên dịch lại" của bài viết rất thú vị. Những gì tôi đang thấy cho các bảng tạm thời là hàng tấn INSERT (có thể dẫn đến hàng triệu hàng), một số cập nhật và xóa. Vì vậy, rất nhiều dữ liệu thay đổi cho các bảng tạm thời. Hàng triệu.


Khi bạn có các procs được lưu trữ để repro vấn đề, bạn có thể tạo một ví dụ tối thiểu để repro nó và làm như vậy để tìm ra vấn đề?
Martin Smith

Câu trả lời:


3

Có hai DMF bộ nhớ cache kế hoạch:

sys.dm_exec_query_plan - trả về các gói được lưu trong bộ định dạng XML, nhưng chỉ có kích thước nhất định (và chỉ miễn là chúng có thể được định dạng dưới dạng XML trong SQL Server, có nghĩa là lên tới 128 cấp độ lồng nhau.)

sys.dm_exec bản_query_plan - trả về các gói được lưu trong bộ nhớ cache ở định dạng văn bản, ở mọi kích thước. Nhưng nhược điểm là khi các gói lớn, bạn không thể chuyển đổi chúng thành XML bên trong SQL Server và thậm chí TRY_CONVERT vì XML trả về null.

sp_BlitzCache chỉ đánh vào DMV trước đây (vì nó cần phân tích các kế hoạch truy vấn dưới dạng XML để thực hiện tất cả các loại cắt và thái hạt lựu.) Tôi đã tạo ra vấn đề Github # 838 để cải thiện điều này để chúng tôi ít nhất có thể cảnh báo người dùng kiểm tra sys.dm_execTHER_query_plan cho họ truy vấn lớn hơn. Mặc dù vậy, chúng tôi vẫn không thể phân tích XML về nó.


Và cũng lý do tương tự sys.query_store_plan.query_plannvarchar(MAX), không phải XML (câu đố SQL).
Remus Rusanu

@RemusRusanu ooo, kế hoạch lớn như vậy xuất hiện ở đó! Đẹp.
Brent Ozar

Chúng tôi đang kiểm tra nếu các kế hoạch bị thiếu là do những gì bạn tìm thấy. Ngay sau khi tôi nghe lại, tôi sẽ đăng cập nhật.
Tara Kizer

Tôi đánh dấu đây là câu trả lời mặc dù tôi chưa nhận được phản hồi từ khách hàng. Đó là điều duy nhất còn lại có thể và có ý nghĩa với các truy vấn khổng lồ. Tôi sẽ đăng một bản cập nhật nếu có gì thay đổi.
Tara Kizer

@TaraKizer bạn chỉ làm điều này vì bài đánh giá hàng quý của bạn sắp được đưa ra, phải không? Tôi thấy những gì bạn đã làm ở đó. TIỀN THƯỞNG KHÔNG GIỚI HẠN.
Brent Ozar

0

Có thể bạn cần điều chỉnh kích thước tối đa của XML mà SSMS có thể trả về lưới?


Không, bởi vì như Tara lưu ý, ngay cả khi bạn viết nó vào một bảng và kiểm tra độ dài ở đó, không có dữ liệu nào quay trở lại.
Brent Ozar
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.