DIR Return Create A Forum - Home
---------------------------------------------------------
ExcelSoft Database Professionals
HTML https://esdbp.createaforum.com
---------------------------------------------------------
*****************************************************
DIR Return to: Scripts
*****************************************************
#Post#: 128--------------------------------------------------
SQL Server Trace Queries
By: srinivasma_exceldbp Date: December 30, 2014, 5:44 am
---------------------------------------------------------
/*Listing 1: The SlowQueries trace definition*/
/****************************************************/
/* Created by: SQL Server 2008 R2 Profiler */
/* */
/****************************************************/
-- Create a Queue
DECLARE @rc INT
DECLARE @TraceID INT
DECLARE @maxfilesize BIGINT
DECLARE @DateTime DATETIME
SET @DateTime = '2012-08-10 21:00:34.207' --** change this
SET @maxfilesize = 5
-- Please replace the text InsertFileNameHere, with an
appropriate
-- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The
.trc extension
-- will be appended to the filename automatically. If you are
writing from
-- remote server to local drive, please use UNC path and make
sure server has
-- write access to your network share
EXEC @rc = sp_trace_create @TraceID OUTPUT, 0,
N'InsertFileNameHere',
@maxfilesize, @Datetime
IF ( @rc != 0 )
GOTO error
-- Client side File and Table cannot be scripted
-- Set the events
DECLARE @on BIT
SET @on = 1
EXEC sp_trace_setevent @TraceID, 10, 1, @on
EXEC sp_trace_setevent @TraceID, 10, 11, @on
EXEC sp_trace_setevent @TraceID, 10, 12, @on
EXEC sp_trace_setevent @TraceID, 10, 13, @on
EXEC sp_trace_setevent @TraceID, 10, 14, @on
EXEC sp_trace_setevent @TraceID, 10, 16, @on
EXEC sp_trace_setevent @TraceID, 10, 17, @on
EXEC sp_trace_setevent @TraceID, 10, 18, @on
EXEC sp_trace_setevent @TraceID, 12, 1, @on
EXEC sp_trace_setevent @TraceID, 12, 11, @on
EXEC sp_trace_setevent @TraceID, 12, 12, @on
EXEC sp_trace_setevent @TraceID, 12, 13, @on
EXEC sp_trace_setevent @TraceID, 12, 14, @on
EXEC sp_trace_setevent @TraceID, 12, 16, @on
EXEC sp_trace_setevent @TraceID, 12, 17, @on
EXEC sp_trace_setevent @TraceID, 12, 18, @on
-- Set the Filters
DECLARE @intfilter INT
DECLARE @bigintfilter BIGINT
EXEC sp_trace_setfilter @TraceID, 10, 0, 7,
N'SQL Server Profiler -
05332afa-db8c-4ded-beca-38e2548e246b'
SET @bigintfilter = 1000000
EXEC sp_trace_setfilter @TraceID, 13, 0, 4, @bigintfilter
-- Set the trace status to start
EXEC sp_trace_setstatus @TraceID, 1
-- display trace id for future references
SELECT TraceID = @TraceID
GOTO finish
error:
SELECT ErrorCode = @rc
finish:
GO
/*Listing 2: The modified sp_trace_create section of the
SlowQueries trace definition*/
SET @DateTime = DATEADD(hh, 1, GETDATE())
SET @maxfilesize = 1024
EXEC @rc = sp_trace_create @TraceID OUTPUT, 2,
N'\\Server1\Share1\MyTrace',
@maxfilesize, @Datetime;
GO
/*Listing 3: Stopping and trace then closing it and deleting its
definition*/
exec sp_trace_setstatus @TraceID = 2, @status = 0; --stop
exec sp_trace_setstatus @TraceID = 2, @staus = 2;
--close/delete
GO
/*Listing 4: Retrieving trace details with fn_trace_getinfo*/
select * from fn_trace_getinfo(0);
GO
/*Listing 5: Importing trace data into a table*/
USE MyDatabase
GO
--import the first file (MyTrace.trc)
SELECT *
INTO MyTrace
FROM FN_TRACE_GETTABLE('\\Server1\Share1\MyTrace.trc', 1);
-- import all the files
SELECT *
INTO MyTrace
FROM FN_TRACE_GETTABLE('\\Server1\Share1\MyTrace.trc',
DEFAULT);
-- import a specifc number of files
SELECT *
INTO MyTrace
FROM FN_TRACE_GETTABLE('\\Server1\Share1\MyTrace.trc', 3);
GO
/*Listing 6: Batching trace file imports*/
SELECT *
INTO MyTrace
FROM FN_TRACE_GETTABLE('\\Server1\Share1\MyTrace.trc', 10);
INSERT INTO MyTrace
SELECT *
FROM FN_TRACE_GETTABLE('\\Server1\Share1\MyTrace_10.trc',
10);
GO
/*Listing 7: Indexing the MyTrace table*/
CREATE NONCLUSTERED INDEX idx_Duration ON MyTrace(Duration);
CREATE NONCLUSTERED INDEX idx_CPU ON MyTrace(CPU);
CREATE NONCLUSTERED INDEX idx_Reads ON MyTrace(Reads);
GO
/*Listing 8: Read-intensive queries in our sample workload*/
USE MyDatabase
GO
SELECT TOP 1000
e.name AS EventName ,
TextData ,
Reads ,
CPU ,
Duration / 1000 AS Duration_in_milliseconds ,
Writes ,
StartTime
FROM MyTrace t
INNER JOIN sys.trace_events e ON t.EventClass =
e.trace_event_id
ORDER BY Reads DESC;
GO
/*Listing 9: Which queries use the most CPU?*/
SELECT TOP 1000
( CPU * 100 ) / ( ( SELECT SUM(CPU)
FROM MyTrace
) * 1.0 ) AS PercentCPU ,
TextData
FROM MyTrace
ORDER BY PercentCPU DESC;
GO
/*Listing 10: CPU by Object accessed*/
DECLARE @TotalCPU BIGINT
SELECT @TotalCPU = SUM(CPU)
FROM MyTrace
SELECT TOP 1000
( CPU * 100 ) / ( @TotalCPU * 1.0 ) AS PercentCPU ,
ObjectName
FROM ( SELECT SUM(CPU) AS CPU ,
ObjectName
FROM MyTrace
GROUP BY ObjectName
) t
ORDER BY PercentCPU DESC;
GO
/*Listing 11: Grouping by TextData*/
DECLARE @TotalCPU BIGINT
SELECT @TotalCPU = SUM(CPU)
FROM MyTrace
SELECT TOP 1000
( CPU * 100 ) / ( @TotalCPU * 1.0 ) AS PercentCPU ,
TextData
FROM ( SELECT SUM(CPU) AS CPU ,
TextData
FROM ( SELECT CPU ,
CONVERT(NVARCHAR(MAX), TextData)
AS TextData
FROM MyTrace
) t1
GROUP BY TextData
) t2
ORDER BY PercentCPU DESC;
GO
/*Listing 12: Finding frequently executed queries*/
SELECT COUNT(*) AS ExecCount ,
ObjectName ,
AVG(Duration / 1000) AS AvgDuration
FROM MyTrace
WHERE ObjectName <> 'sp_reset_connection' -- connection
pooling
GROUP BY ObjectName
ORDER BY ExecCount DESC;
GO
/*Listing 13: Execute
sp_SQLskills_ConvertTraceToExtendedEvents*/
EXECUTE sp_SQLskills_ConvertTraceToExtendedEvents
@TraceID = 2,
@SessionName = 'XE_SlowQueries2',
@PrintOutput = 1,
@Execute = 0;
/*Listing 14: Output of
sp_SQLskills_ConvertTraceToExtendedEvents using MyTrace
definition*/
IF EXISTS (SELECT 1 FROM sys.server_event_sessions WHERE name =
'XE_SlowQueries2')
DROP EVENT SESSION [XE_SlowQueries2] ON SERVER;
GO
CREATE EVENT SESSION [XE_SlowQueries2]
ON SERVER
ADD EVENT sqlserver.rpc_completed(
ACTION
(
sqlserver.server_principal_name
, sqlserver.session_id
-- BinaryData not implemented in XE for this event
)
WHERE
(
duration >= 1000000
)
),
ADD EVENT sqlserver.sql_batch_completed(
ACTION
(
sqlserver.server_principal_name
, sqlserver.session_id
)
WHERE
(
duration >= 1000000
)
)
ADD TARGET package0.event_file
(
SET filename = '\\Server1\Share1\XE_SlowQueries2.xel',
max_file_size = 1024,
max_rollover_files = 0
)
/*Listing 15: Start XE_MyTrace*/
ALTER EVENT SESSION [XE_SlowQueries2]
ON SERVER
STATE = start;
/*Listing 16: Stop and delete XE_MyTrace*/
ALTER EVENT SESSION [XE_SlowQueries2] ON SERVER STATE = stop;
DROP EVENT SESSION [XE_SlowQueries2] ON SERVER;
*****************************************************