Tóm tắt các khóa cho một truy vấn


7

SQL Server có cách đơn giản nào để tìm nạp số liệu về số lượng (và có thể loại khóa) của một truy vấn đã cho trong quá trình thực hiện không?

Đặt vấn đề ...
Tôi đang trong quá trình viết lại một thủ tục lưu trữ khá khó chịu, sử dụng nhiều con trỏ. Một giải pháp dựa trên tập hợp là có thể, và kết quả là tôi đã có ba phiên bản trên đó: phiên bản gốc, phiên bản dựa trên tập hợp với các bảng bảng và phiên bản dựa trên tập hợp hoàn toàn dựa trên CTE. Tôi đang nhận được các số liệu tốt cho giải pháp dựa trên CTE, nhưng vì kích thước và độ phức tạp của truy vấn được tạo bởi phiên bản CTE, tôi cảnh giác khi phát hành nó cho đến khi tôi thực hiện hết sức có thể.

Bây giờ tôi nhận ra rằng các khóa SQL lấy ra là những khóa mà nó nghĩ rằng nó cần phải tháo ra tại một thời điểm nhất định và trên một máy chủ sản xuất được tải, nó có thể hoạt động khác đi, nhưng tôi hy vọng nó sẽ mang lại cho tôi cảm giác về cách nó sẽ hành xử.

Hiện tại tôi đang sử dụng profiler và giữ các giao dịch mở để tôi có thể chạy sp_lock, nhưng tự hỏi liệu tôi có thiếu một thủ thuật nào trong SQL Server 2008 không.

Ngoài ra, tôi đang cố gắng thuyết phục bản thân rằng trình hồ sơ trả về số lần đọc cao khi chèn vào biến bảng là ổn (với giá trị nhất định là ổn), nhưng tôi đã không thuyết phục được chính mình. Giải pháp CTE có một nửa số lần đọc của phiên bản bảng-var và số lần đọc cao của phiên bản bảng-var dường như hoàn toàn nằm trong phần chèn. Về thời lượng, cả CTE và bảng var đều giống nhau, cho thời gian thực hiện nhanh hơn khoảng 150-200% so với cách tiếp cận dựa trên con trỏ.


Bạn có thể theo dõi các khóa được mua và phát hành trong Profiler được lọc cho một spid. Sau đó, script ra dưới dạng SQL Trace và truy vấn tệp theo dõi sys.fn_trace_gettable. Bạn cũng đã đánh giá một #tempbảng?
Martin Smith

Đúng, đi xuống tuyến đường #temp và nhận được kết quả không nhất quán; đôi khi nhanh hơn, đôi khi chậm hơn, đánh giá cùng một bộ dữ liệu (khiến tôi hơi bối rối). Tôi vẫn chưa hoàn toàn giảm giá nó ... cũng: quên mất fn_trace_gettable; đã sử dụng nó trước đây, nhưng đừng sử dụng nó thường xuyên đủ để nhớ về nó, sẽ xem xét điều đó, ta.
Chris J

Câu trả lời:


6

Sự kiện mở rộng với mục tiêu Biểu đồ , mục tiêu bộ đếm sự kiện hoặc mục tiêu nhóm. Bạn có thể bắt đầu từ Cách: Tìm các đối tượng có nhiều khóa nhất được lấy trên ví dụ về chúng trên MSDN, cung cấp gần như chính xác những gì bạn muốn. Bạn có thể sửa đổi ví dụ để lấy các loại khóa (ví dụ 'như là' lọc ra các khóa S và U) và bạn có thể tinh chỉnh nó để lọc mỗi phiên, v.v.

Điều đó đang được nói, tôi phải chỉ ra rằng việc tiếp cận một cuộc điều tra hiệu suất từ ​​việc đếm các ổ khóa có được là rất bất thường. Trọng tâm thường là các số liệu thống kê chờ, như được mô tả trong phương pháp Chờ và Hàng đợi . Xem ví dụ Nắm bắt số liệu thống kê chờ cho một thao tác để biết cách sử dụng, một lần nữa, Sự kiện mở rộng để nắm bắt thông tin liên quan cho một truy vấn cụ thể.

Mặt khác, nếu bạn lo ngại về các khóa theo quan điểm đồng thời (các CTE mới sẽ tạo ra nhiều sự tranh chấp do khóa?) Thì tôi khuyên bạn nên điều tra triển khai cách ly ảnh chụp nhanh .


0

Lấy một bên của truy vấn khi nó đang chạy và sau đó cắm nó vào sys.dm_tran_locks .

select * from sys.dm_tran_locks where request_session_id='insert sid here'
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.