At Hotsos we are all about performance. And at the heart most performance problems is
a select statement more often than not. In the
past my go-to tool to do performance optimization and training has been
SQL*Plus. Of late I’m moving more and more to SQL
Developer. Because it has changed from a tool that was so-so several years ago
to a powerhouse of features and functionality.
In this short bit I just want to talk about the autotrace
feature in particular and how to use it for performance optimization of a
select. Some key things to focus on
when optimizing a query is logical IOs (LIOs), Starts and of course time. And pretty much in that order. Time is of course the goal, make it run fast.
How to make it faster? Make sure it does less work. How do you measure work of a query? LIOs.
Now I take a short look at how to use autotrace to do this. I’m using the 17.4 drop of SQL Developer.
This is a query that returns some customer information and
the last date they placed an order. The code looks like this:
Just a quick tip, avoiding distinct when not needed. It does
invoke extra work so make sure it’s really necessary, here the code needs it
because a customer could place more than one order per day. Using autotrace in SQL Developer we can see
this for the plan:
The column headings that are cut off are: LAST_STARTS, LAST_OUTPUT_ROWS,
CARDINALITY, LAST_CR_BUFFER_GETS, LAST_ELAPSED_TIME and QBLOCK_NAME. With these columns you have really good idea
what is happening with your query.
Looking the top line you can see the query did 267,478 LIOs
(LAST_CR_BUFFER_GETS) to get the result set of 1000 rows (LAST_OUTPUT_ROWS). That’s and average of 267 LIOs per row
returned. That seems high. Maybe it’s OK, but one other thing gives me a
strong hint that isn’t ideal. Notice
that the query block named MAX_BLOCK is executing 1,310 times. And this repeated execution is driving the
vast majority of the LIOs. This part of
the plan also takes the longest which is often true, but not always.
Rewriting the code to use an analytic to find the max date would look like this:
Using autotrace on this code, this is the plan and statistics:
Wow! That’s
great. Notice the starts is 1 all the
way up and down the plan, the total LIOs is down to an almost unbelievable 238
from 267,478. And the time of course
dropped to .22 seconds from 1.7 seconds.
A nice thing to do in SQL Developer is put both code blocks
in one editor window. Then do autotrace
on both and it’s easy to compare the runs. Here I’ve done that and after each autotrace
finished I did a right click on the tab and renamed each. Then do a right click on either one lets you
compare it to the other (I right clicked on SubQ to get what is shown
below).
Below the plan is a boat load of stats collect by the
autotrace and doing the compare you can see how these have changed. Ones that are different are in red, and nearly
all of them are in red here. (There are more below this screen shot and some are
the same.) The consistent gets (yet another name for LIOs) dropped way way down.
SQL Developer doesn’t really do anything that you can’t do
in something like SQL*Plus. For example
at Hotsos we have a free tool called the Harness that collects all this same information
in SQL*Plus. SQL Developer pulls all
this information together for you in a very easy to navigate presentation. This
makes it a snap to read and analyze the problem which then helps you make the
right decisions. If you're not using SQL Developer you really need to start.
Also for great info on installing, configuring and using SQL Developer, hop over to Jeff Smith's Blog. He's the main man for SQL Developer, he with his outstanding team have made it a powerful and indispensable part of SQL development.