| 
	
 | 
 Posted by Hugo Kornelis on 10/26/06 20:51 
On 26 Oct 2006 11:29:57 -0700, comp_databases_ms-sqlserver wrote: 
 
>SET STATICS PROFILE ON is a good solution. Thanks for that. How do you 
>troubleshoot performance problems of a proc with 2000+ lines of code 
>that is using 10+ temp tables? 
>I am not able to configure SQLDebugger from a client. I have to be on 
>the server to use it. This applies to SQL2000. 
 
Hi comp_databases_ms-sqlserver, 
 
That's a pretty broad question! 
 
Some of the things I'd look into if I was assigned this task would be 
(in random order): 
 
* Try to combine some or even all steps of the procedure into one single 
query. Procs like this are often the result of procedural thinking. New 
SQL coders with a background in procedural languages often tend to think 
in the steps required to get somewhere. They will then code a sequence 
of steps, with temp tables to hold intermediate results. A truly 
set-based and declarative solution gives the optimzer more freedom to 
rearrange steps and reduces the amount of moving data around. This can 
yield huge benefits in performance. 
 
* Create temp tables at the start of the stored proc. This reduces the 
number of recompiles (and at 2000+ lines, recompiling the proc will 
probably take a noteable amount of time). It also gives you the 
opportunity to declare indexes on the temp tables BEFORE data is put 
into them - this will reduce the number of recompiles even further and 
it may speed up execution. However, it can also sometimes be better to 
postpone index creation until after the temp table is populated, even 
though this means accepting a recompilation. Test various strategies to 
find out. 
 
* Copy the code from the stored procedure to Query Analyzer and run it 
one step at a time, using BEGIN TRAN, ROLLBACK and COMMIT as needed to 
be able to repeat each step multiple times. This gives you the option to 
get an execution plan for each step, and also to try different versions 
of the query and/or different indexes to see how they change the 
execution speed of that particular part of the proc. 
 
* Setup a profiler trace, run the stored proc, then use the output from 
the profiler trace to identify which part(s) of the stored proc are 
responsible for the largest portion of the execution time. 
 
* Check if your procedure might be subject to parameter sniffing (google 
for it if you've never heard of the term). 
 
* If you really can't combine the steps, consider breaking the procedure 
in several smaller parts. This reduces compilation time when 
recompilations are needed and can be leveraged to solve parameter 
sniffing problems. 
 
There are probably more things you can do, but these are the ones I can 
think of at the top of my head. 
 
Good luck! 
 
--  
Hugo Kornelis, SQL Server MVP
 
  
Navigation:
[Reply to this message] 
 |