Làm thế nào để hồ sơ thủ tục lưu trữ


26

Tôi đang sử dụng SQL Server 2012 và đang tự hỏi làm thế nào để cấu hình các thủ tục được lưu trữ

Chẳng hạn, trình lược tả có thể ghi lại từng câu lệnh SQL riêng lẻ trong một thủ tục được lưu trữ, nó là gì và mất bao lâu để chạy vv?

Tôi đang cố gắng chẩn đoán các thủ tục lưu trữ sao chép hợp nhất và điều này phải được nắm bắt một phần trong toàn bộ hoạt động của tác nhân hợp nhất. Dường như không thể lấy thủ tục được lưu trữ với các vấn đề về hiệu năng và chạy lại vì tại thời điểm đó nó không chậm.

Câu trả lời:


27

Câu trả lời của Kevin mô tả những sự kiện cần ghi lại trong SQL Trace / SQL Profiler. Để mở rộng câu trả lời đó một chút - SP:StmtCompletedsẽ hiển thị cho bạn từng câu trong một thủ tục được lưu trữ đang được hoàn thành, như âm thanh.

Ngoài ra nếu bạn đang ở trên một hệ thống bận rộn và cố gắng chẩn đoán vấn đề về hiệu năng, bạn nên cẩn thận với SQL Profiler. SQL Profiler chậm hơn nhiều so với truy tìm tệp hoặc sử dụng Sự kiện mở rộng. Bài đăng trên blog này của Jonathan Kehayias cho thấy khoảng 90% chi phí hoạt động của hệ thống từ việc sử dụng SQL Profiler và khoảng 10% chi phí từ truy tìm đến tệp. Ít hơn cho các sự kiện mở rộng. Đó là lý do tại sao thường không nên chạy SQL Profiler cho đến khi

Mặc dù thông tin này có sẵn thông qua các Sự kiện mở rộng, tôi sẽ đề nghị vẫn sử dụng SQL Trace (công nghệ đằng sau SQL Profiler) nhưng thay vào đó là truy tìm tệp(nếu bạn muốn đầu tư vào việc học và sử dụng các Sự kiện mở rộng thì đây sẽ là hướng đi, trong phiên bản tương lai của SQL Server SQL Trace sẽ biến mất và tất cả chúng ta sẽ có là Sự kiện mở rộng). Tôi cũng đề nghị bạn lọc qua nút Bộ lọc Cột ra càng nhiều nhiễu nền càng tốt để đảm bảo bạn chỉ chụp được những gì cần thiết. Bạn có thể thiết lập theo dõi của mình bằng công cụ Profiler bằng các bước Kevin mô tả trong câu trả lời hay của anh ấy và sau đó thêm bộ lọc từ cùng GUI đó. Sau đó, bạn có thể xuất theo dõi dưới dạng tập lệnh và chạy tập lệnh đó trên SQL Server truy tìm tệp trên thư mục không chứa tệp nhật ký giao dịch hoặc cơ sở dữ liệu. Để xuất, bạn chỉ cần thiết lập dấu vết của mình, chạy trong vài giây để đảm bảo rằng bạn đang nắm bắt những gì bạn muốn, dừng nó và sau đó đi đến thanh menu và File->Export-> Script Trace Definitionvà lưu tệp. Sau đó mở tệp đó trong một cửa sổ truy vấn mới trên máy chủ mà bạn định theo dõi. Bạn có thể xem thêm về các tùy chọn và định nghĩa của tập lệnh này mà bạn đã tạo bằng cách xem các bài viết trợ giúp cho các quy trình được lưu trữ khác nhau được sử dụng trong tập lệnh mà bạn vừa tạo bằng cách bắt đầu ở đây .

Nếu bạn có thời gian và muốn tìm hiểu, bạn cũng có thể đọc một số bài viết về Sự kiện mở rộng và xem cách nắm bắt thông tin. Jonathan Kehayias là một tài nguyên tuyệt vời cho các bài đăng trên blog khi bạn đã sẵn sàng để bắt đầu ở đó.


2
Còn khi SP: StmtCompleted chỉ hiển thị "- Văn bản được mã hóa" trong văn bản truy vấn thì sao? Làm thế nào chúng ta có thể tìm ra các bảng đang được truy cập?
Brain2000

Gặp vấn đề tương tự như bạn @ Brain2000 ....
wenzzzel

21

Bạn có thể chụp các câu lệnh riêng lẻ trong một thủ tục được lưu trữ thông qua SQL Server Profiler. Để thực hiện việc này, trong tab Lựa chọn sự kiện, hãy nhấp vào hộp kiểm "Hiển thị tất cả sự kiện". Sau đó, cuộn xuống danh mục Thủ tục được lưu trữ và chọn hộp bên cạnh SP: StmtCompleted . Nếu bạn cũng có các sự kiện SQL: BatchStartedSQL: BatchCompleted được chọn, bạn có thể có được một hình ảnh từ đầu đến cuối của một thủ tục được lưu trữ, buộc tất cả lại với nhau bằng SPID.

Cũng có thể giúp xem xét bộ đệm của kế hoạch để xem liệu bạn có thể nhận được gói truy vấn cho quy trình thực hiện chậm của mình không. Bạn có thể bắt đầu với một cái gì đó như thế này:

SELECT 
    OBJECT_NAME(st.objectid,st.dbid) AS ObjectName,
    cp.usecounts AS ExecutionCount,
    st.TEXT AS QueryText,
    qp.query_plan AS QueryPlan
FROM 
    sys.dm_exec_cached_plans AS cp
    CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
    CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
WHERE 
    cp.objtype = 'Proc'
    AND OBJECT_NAME(st.objectid,st.dbid) = 'YourStoredProcedure';
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.