SQL Query Order of Operations:
Lately, I have been looking into SQL query optimization.
We recently installed SeeFusion on our server and I can see where my long
running tasks are causing the server to slow down. Turns out, not surprisingly,
that the slow pages are very query-intense. Granted, a lot of these pages were
pages years ago before I knew what nice code looked like, but the good news it,
lots of room for optimization and clean up.
To start out, I thought it would be good to look up the
order in which SQL directives get executed as this will change the way I can
optimize:
1.
FROM clause
2.
WHERE clause
3.
GROUP BY clause
4.
HAVING clause
5.
SELECT clause
6.
ORDER BY clause
This order holds some very interesting pros/cons:
FROM Clause
Since this clause executes first, it is our first
opportunity to narrow down possible record set sizes. This is why I put as many
of my ON rules (for joins) as possible in this area as opposed to in the WHERE
clause:
·
FROM
·
contact c
·
INNER JOIN
·
display_status d
·
ON
·
(
·
c.display_status_id = d.id
·
AND
·
d.is_active = 1
·
AND
·
d.is_viewable = 1
·
)
This way, by the time we get to the WHERE clause, we
will have already excluded rows where is_active and is_viewable do not equal 1.
WHERE Clause
With the WHERE clause coming second, it becomes obvious
why so many people get confused as to why their SELECT columns are not
referencable in the WHERE clause. If you create a column in the SELECT
directive:
·
SELECT
·
( 'foo' ) AS bar
It will not be available in the WHERE clause because the
SELECT clause has not even been executed at the time the WHERE clause is being
run.
ORDER BY Clause
It might confuse people that their calculated SELECT
columns (see above) are not available in the WHERE clause, but they ARE
available in the ORDER BY clause, but this makes perfect sense. Because the
SELECT clause executed right before hand, everything from the SELECT should be
available at the time of ORDER BY execution.
I am sure there are other implications based on the SQL
clause order of operations, but these are the most obvious to me and can help
people really figure out where to tweak their code.
0 comments:
Post a Comment