(DIR) Return Create A Forum - Home
       ---------------------------------------------------------
       ExcelSoft Database Professionals
 (HTM) 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;
       *****************************************************