In this recipe, we first created and configured our trace by executing a T-SQL script. The script first declares some required variables whose values are passed as parameters to system stored procedures. It creates a trace by executing the sp_trace_create
stored procedure that returns ID of the newly created trace. The stored procedure sp_trace_create
accepts the following parameters:
@traceid OUTPUT
@options
@tracefile
The @Options
parameter is passed to specify the trace options. The following are the predefined values for the @Options
parameter:
The parameter @TraceFile
specifies the location and file name where the trace file should be saved. @TraceID
is the output variable and the returned ID value of the trace will be stored in this variable. If the stored procedure can create a trace file successfully, it returns 0
that gets stored in variable @ReturnCode
.
Note
Remember that all SQL Trace system stored procedures are strictly typed. By saying strictly typed, it means that the data types of the parameters that you pass to these stored procedures must match exactly with the data types of stored procedures' parameter definition. So, you cannot pass a parameter of type INT when BIGINT is required.
If trace is created successfully and @ReturnCode
is zero, then we add event classes and data columns by calling stored procedure sp_trace_setevent
for each combination of event class and data column one-by-one for following event classes and data columns:
DataFileAutoGrow
event class and DatabaseName data column
DataFileAutoGrow
event class and FileName data column
DataFileAutoGrow
event class and StartTime data column
DataFileAutoGrow
event class and EndTime data column
LogFileAutoGrow
event class and DatabaseName data column
LogFileAutoGrow
event class and FileName data column
LogFileAutoGrow
event class and StartTime data column
LogFileAutoGrow
event class and EndTime data column
Stored procedure accepts the following parameters:
@traceid
@eventid
@columnid
@on
@TraceID
is the ID of the trace we add event classes and data columns to.
Note that every event classes and data columns have their associated event IDs and column IDs. We have to pass these ID values corresponding to event classes and data columns that we want to include in our trace. These values are passed by appropriate variables declared for each event class and data column. For example, for DataFileAutoGrow
event class and FileName data column we have stored their appropriate ID values in @Event_DataFileAutoGrow
and @DataColumn_FileName
variables respectively.
Tip
How to get IDs for all event classes and data columns?
ID values for required event classes and data columns must be passed to the stored procedure sp_trace_setevent
. You can get a list of EventIDs for all event classes by querying sys.trace_events
system catalog view. To get a list of column IDs for all data columns, use sys.trace_columns
system catalog view. Also, you can retrieve list of column IDs for all available columns for a given event by querying sys.trace_event_bindings
system catalog view and by joining it with sys.trace_events
and sys.trace_columns
system catalog views on trace_event_id
and trace_column_id
columns respectively.
The value of @
on parameter value can be either 0
or 1
where the value 1
means that event data for specified event class and data column should be captured otherwise not.
After adding the required event classes and data columns, the stored procedure sp_trace_setstatus
is used to set the status of the trace to START
. Any trace that is created with system stored procedure is always in STOP
state by default, and needs to be started explicitly by calling sp_trace_setstatus
stored procedure. This stored procedure accepts the following parameters:
@TraceID
is the ID of the trace we created and need to be started. @Status
specifies the state of the trace. Possible values for @Status
parameter are as follows:
0:
Stops a trace
1:
Starts a trace
2:
Closes a trace
Because we wanted to start our trace, we are passing a value of 1
to this parameter.
SQL Server keeps track of currently opened trace sessions. This list of traces can be retrieved by querying sys.traces
system catalog view. We just make sure by querying this view that the trace is indeed created.
Next, we create a sample database named SampleDBTrace
. We deliberately keep the value of FILEGROWTH
attribute smaller in order to be able to produce Data File Auto Growth
and Log File Auto Growth
events. The script also creates a sample table named tbl_SampleData
though SELECT ... INTO
statement in which we insert one million sample records by cross joining sys.columns
system catalog view with itself multiple times. This operation requires additional space in data and log files to make room for inserting new records. For this, SQL Server has to increase the size of data and log files when required by one MB (specified value for the FILEGROWTH
attribute). This causes DataFileAutoGrowth
and LogFileAutoGrowth
events to be raised.
Note
We deliberately kept the value of the FILEGROWTH
attribute as smaller as 1 MB in order to demonstrate this recipe. Setting value of the FILEGROWTH
attribute this small is just for the sake of being able to produce the desired file growth events. Such small value for the FILEGROWTH
attribute is not recommended and should not be used on production server with heavy DML operations.
Once the record insertion operation is completed, the script is executed to stop and close the trace by again calling the stored procedure sp_trace_setstatus
twice with the appropriate status value for each call. Remember that to close a trace, it should be stopped first. So, a trace should be stopped first before it can be closed.
After closing a trace, we make sure that the trace stopped and closed successfully by querying sys.traces
system catalog view again.
Once our trace is stopped, we use fn_trace_gettable()
function to query the captured trace data saved in specified trace file whose full file path is also being passed to the function for the first parameter filename
. We also pass the default value for the second parameter number_files
of the function which specifies that the function should read all rollover files to return trace data. Because this function does not return any column for the event class' name, we join it with sys.trace_events
system catalog view on IDs of event classes in order to fetch the names of event classes.
Tip
If you want to analyze large size of trace data containing large number of trace files, then you should specify 1
for number_files
parameter. If you specify default, the SQL Server tries to load all trace files into memory and then inserts them into a table in a single operation, which may crash your system.