2008-11-03 38 views
62

Màn hình hoạt động trong sql2k8 cho phép chúng tôi xem các truy vấn tốn kém nhất. Ok, đó là mát mẻ, nhưng có cách nào tôi có thể đăng nhập thông tin này hoặc nhận được thông tin này thông qua phân tích truy vấn? Tôi không thực sự muốn có giao diện điều khiển quản lý Sql mở và tôi nhìn vào bảng điều khiển màn hình hoạt động.Làm cách nào để tôi có thể đăng nhập và tìm các truy vấn đắt nhất?

Tôi muốn tìm ra những truy vấn được kém bằng văn bản/schema được thiết kế kém vv

Nhờ đống đối với bất kỳ sự giúp đỡ!

Trả lời

60
  1. Sử dụng SQL Server Profiler (trên menu công cụ trong SSMS) để tạo ra một dấu vết mà các bản ghi những sự kiện này:

    RPC:Completed 
    SP:Completed 
    SP:StmtCompleted 
    SQL:BatchCompleted 
    SQL:StmtCompleted 
    
  2. Bạn có thể bắt đầu với các tiêu chuẩn theo dõi mẫu và prune nó. Bạn không chỉ định liệu đây có phải là một cơ sở dữ liệu cụ thể hay toàn bộ máy chủ, nếu nó dành cho các Db cụ thể, bao gồm cột DatabaseID và đặt bộ lọc cho DB của bạn (SELECT DB_ID('dbname')). Đảm bảo cột dữ liệu Đọc hợp lý được bao gồm cho mỗi sự kiện. Đặt dấu vết để đăng nhập vào một tập tin. Nếu bạn để lại dấu vết này để chạy không được giám sát trong nền, bạn nên đặt kích thước tệp theo dõi tối đa là 500MB hoặc 1GB nếu bạn có nhiều chỗ (tất cả phụ thuộc vào số lượng hoạt động trên máy chủ, vì vậy, bạn sẽ phải hút nó và xem).

  3. Bắt đầu theo dõi nhanh và sau đó tạm dừng. Goto File-> Export-> Script Trace Definition và chọn phiên bản DB của bạn, và lưu vào một tập tin. Bây giờ bạn có một kịch bản lệnh sql tạo ra một dấu vết có ít chi phí hơn nhiều so với việc chạy qua GUI profiler. Khi bạn chạy tập lệnh này, nó sẽ xuất ra ID Dấu vết (thường là @ID=2); lưu ý điều này.

  4. Một khi bạn có một dấu vết tập tin (.trc) (hoặc các dấu vết hoàn thành do đạt kích thước tập tin tối đa hoặc bạn dừng lại các dấu vết sử dụng chạy

    EXEC sp_trace_setstatus @ID, 0
    EXEC sp_trace_setstatus @ID , 2

Bạn có thể tải các dấu vết vào hồ sơ, hoặc sử dụng ClearTrace (rất tiện dụng) hoặc tải nó vào một bảng như sau:

SELECT * INTO TraceTable 
FROM ::fn_trace_gettable('C:\location of your trace output.trc', default) 

Sau đó, bạn có thể chạy một truy vấn để tổng hợp dữ liệu như thế này:

SELECT COUNT(*) AS TotalExecutions, 
    EventClass, CAST(TextData as nvarchar(2000)) 
,SUM(Duration) AS DurationTotal 
,SUM(CPU) AS CPUTotal 
,SUM(Reads) AS ReadsTotal 
,SUM(Writes) AS WritesTotal 
FROM TraceTable 
GROUP BY EventClass, CAST(TextData as nvarchar(2000)) 
ORDER BY ReadsTotal DESC 

Một khi bạn đã xác định được các truy vấn tốn kém, bạn có thể tạo và kiểm tra kế hoạch thực hiện thực tế.

+0

cổ vũ! âm thanh phức tạp hơn một chút mà tôi nghĩ là cần thiết, nhưng tôi chắc chắn sẽ cung cấp cho nó một đi :) chúc mừng! –

+0

Bị dẹp - tôi hy vọng sẽ có cơ hội vào cuối tháng mười một .. và sau đó tôi sẽ đánh dấu câu hỏi hoặc hỏi thêm q. –

2

SQL Server Profiler có làm những gì bạn cần không? Tôi chưa sử dụng năm 2008 nhưng tôi không biết nếu công cụ vẫn còn trong đó nhưng nếu tôi tin rằng bạn có thể thiết lập một dấu vết để truy vấn nhật ký đáp ứng tiêu chí cụ thể (chẳng hạn như những người thực thi và lái xe CPU ở trên một ngưỡng nhất định).

Chúng tôi đã sử dụng điều này trong dự án của chúng tôi và đã thực hiện một công việc khá tốt để giúp chúng tôi khắc phục sự cố truy vấn kém (mặc dù không để nó toàn thời gian, dựa vào Bộ đếm hiệu suất Windows chung để theo dõi tình trạng hiệu suất).

+0

hmm .. tôi đã sử dụng đống hồ sơ, nhưng điều đó không tóm tắt thông tin. đó là một dòng cho mỗi loại truy vấn của sự vật. –

4

Tôi chưa bao giờ nghe nói về công cụ này trước đây, nhưng Microsoft cung cấp một bộ báo cáo thực hiện một công việc tuyệt vời để cung cấp cho bạn chính xác điều này - bao gồm các truy vấn chậm nhất. Hãy xem Performance Dashboard Reports của họ.

Không chắc liệu chúng có tương thích với SQL 2008 hay không nhưng đáng để kiểm tra.

2

Có một công cụ mới, Performance Studio trong SQL Server 2008 được xây dựng ở đầu Chế độ xem quản lý động được duy trì tự động bởi máy chủ, cung cấp tổng quan về hiệu suất máy chủ. Nó đáng để kiểm tra.

20

Tập lệnh sau cung cấp cho bạn kết quả.

SELECT TOP 10 
SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, 
((CASE qs.statement_end_offset 
WHEN -1 THEN DATALENGTH(qt.TEXT) 
ELSE qs.statement_end_offset 
END - qs.statement_start_offset)/2)+1), 
qs.execution_count, 
qs.total_logical_reads, 
qs.last_logical_reads, 
qs.total_logical_writes, qs.last_logical_writes, 
qs.total_worker_time, 
qs.last_worker_time, 
qs.total_elapsed_time/1000000 total_elapsed_time_in_S, 
qs.last_elapsed_time/1000000 last_elapsed_time_in_S, 
qs.last_execution_time,qp.query_plan 
FROM sys.dm_exec_query_stats qs 
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt 
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp 
ORDER BY qs.total_logical_reads DESC 
+1

Đây chính xác là những gì tôi muốn. Thật dễ dàng để tạo một công việc để lưu nó ra. Cảm ơn. – Jbecwar

+17

Điều này có được lấy từ đây không? => http://blog.sqlauthority.com/2010/05/14/sql-server-find-most-expensive-queries-using-dmv/ Nếu vậy, đó là một phong cách tốt hơn để đề cập đến nó ... – YvesR

Các vấn đề liên quan