The SQL Profiler is a great tool for monitoring and
analyzing SQL Server Performance. I use it all the time to watch the detailed
actions of a stored procedure, trigger or user-defined function (UDF) that I am
developing. It can also be used to monitor aggregate performance of an entire
SQL Server instance, a single database, or to isolate performance problems.
When you are interested in overall performance, using SQL Profiler over time,
by that I mean every day, improves your knowledge of your system and its
performance characteristics and provides the information you need to spot
trends and changes of behavior.
SQL Profiler is a graphical interface to SQL Server’s trace capability
but it is not the only way to run a trace. Calling a group of system stored
procedures, whose names all begin with the characters "sp_trace_",
can also create them. In fact, SQL Profiler uses these stored procedures
behind the scenes to do the tracing that you request.
Traces can be sent to the SQL Profiler window, a database table
or a sequential disk file. However, tracing is not resource free. In fact, it
can consume considerable resources, particularly if you send the trace to SQL
Profiler. Since the most important time to monitor is the time of maximum
server load, you do not want the act of measurement to slow the system
unnecessarily. For most applications that run in a business environment, peak
activity occurs in the middle of the afternoon.
The disk file is by far and away the fastest destination for
a trace and it interferes the least with the performance of SQL Server.
However, for analysis purposes, a table is the best destination. Once the data
is in a table, the information can be sliced and diced to your heart’s
content. Most importantly, trend reporting, using data from multiple days, is
possible.
This article presents a technique for writing a stored
procedure that creates a trace. To achieve the best performance the proc sends
its output to a file on disk. A second step moves the data from the trace file
into a SQL table for analysis. The second step doesn’t have to be performed
exactly when the data is recorded. In fact, it’s usually loaded overnight when
server utilization is low and then followed by any standard reports. By using
the file as the trace destination and loading the data overnight, this solution
does the best to minimize the peak-hour resources required for monitoring.
Although you could manually use the SQL Profiler to create a
trace at the same time every day and send it to a file, it is difficult to be
consistent and this is a task that is easily automated. By using the stored
procedure and a SQL Job that runs the stored procedure, you can run the exact
same trace at the same time of day, every day. This kind of data gathering
provides consistent information for effective performance analysis.
The most tedious part of the process is creating the stored
procedure that executes the trace. Fortunately, SQL Profiler will write almost
all of it for you. With a few modifications, it is easy to turn its script
into a stored procedure that can be run on a schedule.