How to Enable SQL Server Query Logging Like MySQL’s General/Slow Query Logs


2 views

For DBAs coming from MySQL, SQL Server offers several comparable logging mechanisms:

-- Enable SQL Server default trace (captures important events)
SELECT * FROM sys.traces WHERE is_default = 1

-- Check if default trace is running
SELECT * FROM fn_trace_getinfo(default)

The most powerful equivalent to MySQL's query logging is Extended Events:

-- Create extended event session for query tracking
CREATE EVENT SESSION [QueryTracking] ON SERVER 
ADD EVENT sqlserver.sql_statement_completed(
    WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],'%SELECT%')))
ADD TARGET package0.event_file(SET filename=N'QueryTracking')
GO

-- Start the session
ALTER EVENT SESSION [QueryTracking] ON SERVER STATE = START
GO

While deprecated, Profiler remains useful for ad-hoc query capture:

-- Sample T-SQL to create a server-side trace (what Profiler uses internally)
DECLARE @TraceID INT
DECLARE @MaxFileSize BIGINT = 10
EXEC sp_trace_create @TraceID OUTPUT, 0, N'C:\Temp\QueryLog', @MaxFileSize, NULL 

-- Add events for query capture
EXEC sp_trace_setevent @TraceID, 12, 1, 1  -- SQL:BatchCompleted
EXEC sp_trace_setevent @TraceID, 12, 12, 1 -- TextData
EXEC sp_trace_setevent @TraceID, 12, 14, 1 -- StartTime

-- Start the trace
EXEC sp_trace_setstatus @TraceID, 1
Feature MySQL SQL Server
General query log general_log Extended Events/Profiler
Slow query log slow_query_log Query Store/Extended Events
Performance impact Medium Configurable (XEvents lightweight)

SQL Server's Query Store provides functionality similar to MySQL's slow query log:

-- Enable Query Store for a database
ALTER DATABASE YourDatabase SET QUERY_STORE = ON
GO

-- Configure Query Store settings
ALTER DATABASE YourDatabase SET QUERY_STORE (
    OPERATION_MODE = READ_WRITE,
    CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30),
    DATA_FLUSH_INTERVAL_SECONDS = 900,
    INTERVAL_LENGTH_MINUTES = 60,
    MAX_STORAGE_SIZE_MB = 1024,
    QUERY_CAPTURE_MODE = AUTO,
    SIZE_BASED_CLEANUP_MODE = AUTO
)
GO

-- View top 10 slowest queries
SELECT TOP 10 
    qt.query_text_id,
    q.query_id,
    p.plan_id,
    rs.avg_duration/1000 AS avg_duration_ms
FROM sys.query_store_query_text AS qt
JOIN sys.query_store_query AS q ON qt.query_text_id = q.query_text_id
JOIN sys.query_store_plan AS p ON q.query_id = p.query_id
JOIN sys.query_store_runtime_stats AS rs ON p.plan_id = rs.plan_id
ORDER BY rs.avg_duration DESC

For developers transitioning from MySQL to SQL Server, one common question is about equivalent logging mechanisms. While SQL Server doesn't have identical "general query log" and "slow query log" features, it offers several powerful alternatives:

The closest equivalent to MySQL's general query log is SQL Server Profiler, which captures and displays all server events:

-- Sample T-SQL to create a server-side trace (alternative to Profiler)
DECLARE @TraceID int
DECLARE @maxfilesize bigint = 5
EXEC sp_trace_create @TraceID OUTPUT, 0, N'C:\temp\QueryLog', @maxfilesize, NULL

The recommended modern approach is using Extended Events (XEvents):

-- Create an Extended Events session to track queries
CREATE EVENT SESSION [QueryTracking] ON SERVER 
ADD EVENT sqlserver.sql_statement_completed(
    WHERE ([duration] > 1000000)) -- 1 second threshold
ADD TARGET package0.event_file(SET filename=N'C:\temp\QueryTracking.xel')
GO

-- Start the session
ALTER EVENT SESSION [QueryTracking] ON SERVER STATE = START;

SQL Server Query Store (introduced in 2016) provides excellent performance tracking:

-- Enable Query Store for a database
ALTER DATABASE YourDatabase 
SET QUERY_STORE = ON (OPERATION_MODE = READ_WRITE);

For real-time query monitoring, these DMVs are particularly useful:

-- Find currently executing queries
SELECT 
    s.session_id,
    r.start_time,
    r.status,
    r.command,
    r.wait_type,
    r.wait_time,
    r.cpu_time,
    r.logical_reads,
    t.text AS [SQL Text]
FROM sys.dm_exec_sessions s
JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE s.is_user_process = 1;

While not exactly equivalent to MySQL logs, SQL Server maintains its own error logs which can be accessed via:

EXEC sp_readerrorlog 0, 1, 'error'; -- Read current error log

Many DBAs use third-party tools like SQL Sentry, Redgate SQL Monitor, or Idera SQL Diagnostic Manager for more comprehensive monitoring capabilities that resemble MySQL's logging features.