Trực quan hóa dữ liệu SQL Server Sự kiện mở rộng


16

Gần đây tôi đã khám phá bằng cách sử dụng các sự kiện mở rộng trong SQL Server để giúp tôi điểm chuẩn và tối ưu hóa các truy vấn khác nhau. Cho đến nay, để xem dữ liệu sự kiện tôi đã sử dụng tính năng "Xem dữ liệu trực tiếp" trong SSMS.

Vấn đề mà tôi gặp phải là có vẻ như tính năng Live Events sử dụng bộ đệm bên trong, điều đó có nghĩa là đôi khi tôi cần thực hiện một truy vấn nhiều lần để thông tin của nó hiển thị trong cửa sổ. Do đó, tôi có một câu hỏi gồm hai phần để hỏi:

  1. Có cách nào để khắc phục sự chậm trễ này trong việc khiến các sự kiện hiển thị trong nguồn cấp dữ liệu trực tiếp không? (Tôi đang làm điều này trên cơ sở dữ liệu cục bộ nên hiệu suất không phải là vấn đề)
  2. Nguồn cấp dữ liệu trực tiếp có phải là cách tốt nhất để trực quan hóa dữ liệu Sự kiện mở rộng không? Có công cụ nào khác trong SSMS hay không phù hợp hơn với trường hợp sử dụng của tôi?

CẬP NHẬT

Theo yêu cầu, đây là phiên:

CREATE EVENT SESSION [Simple Query Benchmarking] ON SERVER 
ADD EVENT sqlserver.sql_batch_completed(SET collect_batch_text=(1)
    ACTION(sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.sql_text)
    WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [package0].[greater_than_uint64]([duration],(1000)))) 
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=1 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO

Câu trả lời:


15

Nên biết trước : Nhiều thông tin được cung cấp dưới đây tôi đã học nghiêm túc từ đi qua hai khóa học Pluralsight bởi Jonathan Keyhayias . Rất đáng giá chi phí một tháng cho đăng ký cộng để trải qua hai khóa học của mình.

Đầu tiên chỉ là một vài điểm quan tâm mà tôi nghĩ sẽ giúp ích (hoặc nhiều nhất là được quan tâm):

  • Khi phiên Sự kiện mở rộng được bắt đầu, nó sẽ có một phần bộ nhớ được phân bổ vào không gian bộ đệm để lưu trữ dữ liệu được tạo bởi các sự kiện của phiên. Trong phiên của bạn, giá trị này được đặt thành giá trị mặc định là 4MB
  • Có nhiều mục tiêu có sẵn để sử dụng. Các mục tiêu này là synchronoushoặc asynchronoustrong cách chúng nhận dữ liệu. Hai mục tiêu được sử dụng phổ biến nhất là Target File và Ring Buffer đều không đồng bộ. Bài viết BOL ở đây chỉ ra loại mỗi mục tiêu .
  • Các MAX_DISPATCH_LATENCYlà một tùy chọn cấu hình điều khiển khi dữ liệu sự kiện được cử đến mục tiêu (s). Công văn chỉ xảy ra cho các mục tiêu không đồng bộ. Có hai điều kiện sẽ khiến dữ liệu sự kiện được gửi đi: (1) bộ nhớ đệm cho phiên đã đầy hoặc (2) dữ liệu sự kiện trong bộ đệm vượt quá MAX_DISPATCH_LATENCYtùy chọn được định cấu hình của phiên .
  • Khi bạn mở Trình xem dữ liệu trực tiếp, nó sẽ đính kèm một mục tiêu bổ sung vào phiên sự kiện có tên là "mục tiêu phát trực tuyến". Điều này sẽ nhận được luồng sự kiện trực tiếp khi bộ đệm đang được gửi đi. Nó thực sự cũng sẽ thay đổi độ trễ công văn liên quan đến phiên thành 3 giây để có được chế độ xem gần thời gian thực của phiên.

Bây giờ đến điểm cụ thể trong câu hỏi của bạn:

Vấn đề mà tôi gặp phải là có vẻ như tính năng Live Events sử dụng bộ đệm bên trong, điều đó có nghĩa là đôi khi tôi cần thực hiện một truy vấn nhiều lần để thông tin của nó hiển thị trong cửa sổ. Do đó tôi có một câu hỏi hai phần để hỏi

Tôi không biết rằng nó làm điều này khác với những gì tôi đã nêu ở trên. Tôi hy vọng rằng sự kiện đã được ghi lại, nó chỉ không đáp ứng các ngưỡng cần thiết để nó được gửi đến người xem dữ liệu trực tiếp của bạn. Tôi đã thử nghiệm điều này với truy vấn sau từ AdventureWorks2012:

SELECT * FROM dbo.ErrorLog
WAITFOR DELAY '00:00:01' ;
GO

Sử dụng cấu hình phiên sự kiện của bạn, ngoại trừ tôi đang lọc để chỉ thu thập dữ liệu cho AdventureWorks2012cơ sở dữ liệu trên phiên bản cục bộ của mình, tôi có thể xem dữ liệu đích cho phiên này và tìm thấy truy vấn đã được ghi lại:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Thực hiện truy vấn này một lần nữa cuối cùng sẽ khiến nó được gửi đi và trình xem dữ liệu hiển thị một sự kiện. Bây giờ nếu bạn thực sự muốn xem tất cả các sự kiện được hiển thị đơn giản STOPlà phiên và bộ đệm sẽ được gửi đi đầy đủ. Tôi thấy điều này khi tôi dừng phiên của mình:

nhập mô tả hình ảnh ở đây

1. Có cách nào để khắc phục sự chậm trễ này trong việc đưa các sự kiện hiển thị trong nguồn cấp dữ liệu trực tiếp không? (Tôi đang làm điều này trên cơ sở dữ liệu cục bộ nên hiệu suất không phải là vấn đề)

Tôi đã nghĩ rằng bạn có thể thay đổi MAX_MEMORYgiá trị thấp hơn để chỉ ra kích thước bộ đệm nhỏ để ghi lại các sự kiện. Tuy nhiên, giá trị thấp nhất bạn có thể đặt này trong SQL Server 2012 là 200KB, truy vấn tôi đã sử dụng không đáp ứng giới hạn đó để khiến nó được gửi ngay lập tức. Điều duy nhất tôi có thể làm là tối đa thực hiện một truy vấn sẽ khiến bộ đệm được tiếp cận và các sự kiện trước đó được ghi lại sẽ được gửi đi:

SELECT *
FROM Person.Person
ORDER BY EmailPromotion DESC;

2.Là nguồn cấp dữ liệu trực tiếp là cách tốt nhất để trực quan hóa dữ liệu Sự kiện mở rộng? Có công cụ nào khác trong SSMS hay không phù hợp hơn với trường hợp sử dụng của tôi?

Không phải là tôi biết hiện tại. Tôi sẽ đề xuất phương pháp tốt nhất để lấy dữ liệu ngay khi nó xảy ra là truy vấn XML cho ring_buffermục tiêu và chỉ cần loại bỏ nó. Tôi có thể lặp lại ví dụ trên và ngay khi tôi thực hiện truy vấn bên dưới, tôi thấy sự kiện này.

-- Create XML variable to hold Target Data
DECLARE @target_data XML
SELECT  @target_data = CAST([t].[target_data] AS XML)
FROM    [sys].[dm_xe_sessions] AS s
JOIN    [sys].[dm_xe_session_targets] AS t
        ON [t].[event_session_address] = [s].[address]
WHERE   [s].[name] = N'Simple Query Benchmarking' AND
        [t].[target_name] = N'ring_buffer' ;

-- Return the full XML document
--SELECT @target_data;

--Shred XMl to get needed data
SELECT  DATEADD(hh, DATEDIFF(hh, GETUTCDATE(), CURRENT_TIMESTAMP), n.value('(@timestamp)[1]', 'datetime2')) AS [timestamp],
    n.value('(data[@name="duration"]/value)[1]', 'bigint') as duration,
    n.value('(action[@name="sql_text"]/value)[1]', 'varchar(max)') as sql_text
FROM @target_data.nodes('RingBufferTarget/event[@name=''sql_batch_completed'']') AS q(n)

nhập mô tả hình ảnh ở đây


3
Câu trả lời tuyệt vời, rất chi tiết. Chỉ có điểm, và nó quan tâm nhiều hơn bất kỳ cuộc thảo luận thực sự nào; bạn đã đề cập đến Johnathan Kehayias và, tôi đồng ý, các khóa học Pluralsight của anh ấy có giá trị 100% với phí 1 tháng. Tuy nhiên, anh ta có một blog nơi anh ta nói về việc anh ta ghét mục tiêu Ring Buffer như thế nào . Đó là từ năm 2014, vì vậy có thể điều đó đã thay đổi ngay bây giờ nhưng đó là một bài đọc thú vị: sqlskills.com/bloss/jonathan/ mẹo
Kalmino

1

.Net 4.7.2 có cách khắc phục để giảm độ trễ ban đầu cho hiển thị sự kiện khi sử dụng mục tiêu trực tiếp.


2
Bạn có thể cung cấp một tài liệu tham khảo để hỗ trợ câu trả lời của bạn? Hiện tại câu trả lời của bạn không có nhiều vấn đề.
John aka hot2use
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.