SQL Uzun Süren Etkinliklerin İzlenmesi

SQL Server'da uzun süren sorguları loglama işlemi, genellikle SQL Server Profiler, Extended Events veya DMV'ler (Dynamic Management Views) kullanılarak yapılır.

SQL Server Profiler, kullanıcı etkinliklerini ve SQL Server olaylarını gerçek zamanlı olarak izlemek için kullanılan bir araçtır. Bu aracı kullanarak uzun süren sorguları yakalayabilirsiniz.

Extended Events Kullanarak Loglamayı Anlatacağım

Extended Events, SQL Server'ın hafif izleme ve sistem izleme mekanizmasıdır ve özellikle uzun süren sorguları izlemek için çok uygundur.

  • SQL Server Management Studio (SSMS)'da Object Explorer'ı açın.
    "Management" kısmına sağ tıklayıp "New Session Wizard"ı seçin.
    Yeni bir Extended Events oturumu oluşturun ve "Do not show this page again" seçeneğini işaretleyin.




    "Events" sayfasında, "rpc_completed" ve "sql_batch_completed" olaylarını ekleyin.
    metin, ekran görüntüsü, yazılım, web sayfası içeren bir resim

Açıklama otomatik olarak oluşturuldu
    metin, ekran görüntüsü, yazılım, web sayfası içeren bir resim

Açıklama otomatik olarak oluşturuldu
    metin, ekran görüntüsü, yazılım, ekran, görüntüleme içeren bir resim

Açıklama otomatik olarak oluşturuldu

     metin, ekran görüntüsü, yazılım, web sayfası içeren bir resim

Açıklama otomatik olarak oluşturuldu

  •  
    metin, ekran görüntüsü, yazılım, web sayfası içeren bir resim

Açıklama otomatik olarak oluşturuldu
    metin, ekran görüntüsü, yazılım, bilgisayar simgesi içeren bir resim

Açıklama otomatik olarak oluşturuldu
    Yönetim db açalım
    Aşağıdaki SP de eteded evett kaydetmemiz lazım bu görselin gelmesi için  
    metin, ekran görüntüsü, ekran, görüntüleme, yazılım içeren bir resim

Açıklama otomatik olarak oluşturuldu
    oş bir new query açıp aşağıdaki kodu çalıştırmamız lazım  

 

USE [ZCheckDB] 

GO 

 

/****** Object:  StoredProcedure [dbo].[GetLongQuery2]    Script Date: 13.12.2023 15:52:12 ******/ 

SET ANSI_NULLS ON 

GO 

 

SET QUOTED_IDENTIFIER ON 

GO 

 

CREATE PROCEDURE [dbo].[GetLongQuery2] 

@StartDate DATETIME, 

@EndDate DATETIME 

AS 

BEGIN 

SET NOCOUNT ON; 

SELECT DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), CURRENT_TIMESTAMP),  

xevents.event_data.value('(event/@timestamp)[1]', 'datetime2')) AS [EventTime] , 

xevents.event_data.value('(event/action[@name="database_name"]/value)[1]', 'nvarchar(max)') AS [DatabaseName], 

xevents.event_data.value('(event/data[@name="duration"]/value)[1]', 'bigint') /1000 AS [DurationMS], 

xevents.event_data.value('(event/data[@name="cpu_time"]/value)[1]', 'bigint') AS [CPUTimeMs], 

xevents.event_data.value('(event/data[@name="logical_reads"]/value)[1]', 'bigint') AS [LogicalReads], 

xevents.event_data.value('(event/data[@name="row_count"]/value)[1]', 'bigint') AS [RowCount], 

xevents.event_data.value('(event/data[@name="statement"]/value)[1]', 'nvarchar(max)') AS [Statement] 

FROM sys.fn_xe_file_target_read_file('C:\SQL Monitoring\LongQuery_0_133469452731440000.xel',null, null, null) 

CROSS APPLY (select CAST(event_data as XML) as event_data) as xevents 

WHERE DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), CURRENT_TIMESTAMP),  

xevents.event_data.value('(event/@timestamp)[1]', 'datetime2'))  >=@StartDate   

AND  

DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), CURRENT_TIMESTAMP),  

xevents.event_data.value('(event/@timestamp)[1]', 'datetime2'))  <=@EndDate; 

END; 

GO 

-----------------------
Aşağıdaki kodu şu şekilde düzenleyiniz; 



"Filter (Predicate)" bölümünde, "duration" üzerinden filtreleme yapın ve belirli bir süreden (örneğin, 10.000.000 nanosaniye = 10 saniye) daha uzun süren sorgular için filtre uygulayın.



Sonrasında longquery sessions start veriyoruz.

Uzun süren loglamasını yaptığımız sorguları aşağıdaki kod ile görüntüleyebilirsiniz;

EXEC ZCheckDB.dbo.GetLongQuery


Tarih kısıtlaması;

exec GetLongQuery2 '2024-02-06 09:00', '2024-02-06 14:00'



Eklenme Tarihi

28-02-2024