Minimize
Blogger List

Johannes Ahrends
Toad and Oracle

Ben Boise
Toad SC Discussions

Kevin Dalton
Benchmark Factory

Steven Feuerstein
PL/SQL Obsession

Devin Gallagher
Toad SC discussions

Stuart Hodgins
JProbe Discussions

  Henrik "Mauritz" Johnson
Toad Tips & Tricks on the "other" Toads
  Mark Kurtz
Toad SC discussions
  Michael Lumbard
Toad SC discussions
Daniel Norwood
Toad for Data Analysts,
Toad Extension for Visual Studio
Debbie Peabody
Toad for Data Analysts
Gary Piper
Toad Reports Manager
John Pocknell
Toad for Oracle, JProbe
Kuljit Sangha
Toad SC discussions
Bert Scalzo Indicates Oracle ACE status
Toad for Oracle, Data Modeling, Benchmarking
Jeff Smith
Toad product family
Richard To
SQL Optimization
Jim Wankowski
DB2 - LUW and z/OS
John Weathington
  Toad Data Modeler Opens in a new window
Data Modeling
 
  Real Automated Code Testing for Oracle
Quest Code Tester blog
 
Minimize
Blog Tags
toad for oracle (122)
oracle (62)
plsql (46)
sql optimization (37)
toad for data analysts (28)
code tester (19)
toad for ibm db2 (13)
automation (11)
batch optimizer (10)
virtualization (10)
schema browser (9)
toad for sql server (9)
data grid (8)
sql (8)
sql editor (8)
toad data modeler (8)
benchmark factory (7)
excel (7)
query builder (7)
report manager (7)
toad extension (7)
visual studio (7)
11g (6)
configuration (6)
freeware (6)
health check (6)
vmware (6)
connect (5)
dba module (5)
er diagrammer (5)
F4 (5)
linux (5)
refactoring (5)
spotlight (5)
unicode (5)
compare (4)
debugger (4)
export (4)
formatter (4)
make code (4)
rman (4)
strip code (4)
benchmark (3)
bfscript (3)
bulk collect (3)
code templates (3)
code xpert (3)
database browser (3)
db2 (3)
notebook (3)
oem (3)
RAC (3)
session browser (3)
speed (3)
sql optimizer (3)
toad for mysql (3)
tpc-c (3)
9.7 (2)
alert log (2)
app designer (2)
awr (2)
code insight (2)
code snippets (2)
collection (2)
compare and sync (2)
compliance (2)
data generator (2)
data warehouse (2)
database explorer (2)
database monitor (2)
explain (2)
forall (2)
ftp (2)
group execute (2)
handbook (2)
installation (2)
job scheduler (2)
multi-task (2)
nested table (2)
os command (2)
profiler (2)
recovery (2)
release history (2)
save as (2)
schema compare (2)
sql recall (2)
stats pack (2)
subversion (2)
team coding (2)
trace file browser (2)
while loop (2)
10g (1)
64 bit (1)
7zip (1)
action (1)
addm (1)
alter (1)
ansi join (1)
array (1)
ccleaner (1)
code coverage (1)
code road map (1)
CRON (1)
cursor for loop (1)
data browser (1)
data subset (1)
database probe (1)
dbms_flashback (1)
dbms_profiler (1)
ddl (1)
feuerstein (1)
filezilla (1)
flash drive (1)
flow control (1)
for loop (1)
group policy manager (1)
hints (1)
import (1)
index (1)
inheritance (1)
invoker rights (1)
ipad (1)
java (1)
latency (1)
log switch (1)
logical model (1)
ltrim (1)
master-detail browser (1)
monitor (1)
multi-select (1)
naming standards (1)
network (1)
object explorer (1)
OEBS (1)
package (1)
parser (1)
partitioning (1)
performance (1)
pragma (1)
project manager (1)
RAT (1)
revo (1)
REXEC (1)
schema report (1)
script manager (1)
search (1)
set operator (1)
sga (1)
slow (1)
sonarsource (1)
source control (1)
space projection (1)
sql monitor (1)
sql navigator (1)
sql script (1)
sql tracker (1)
sql*plus (1)
standards (1)
statistics (1)
stored procedure (1)
string parser (1)
sub-model (1)
sub-type (1)
synch (1)
synchback (1)
TELNET (1)
toad (1)
trace (1)
unit test (1)
unix (1)
usb (1)
utility (1)
v10 (1)
v9.5 (1)
version control (1)
waits (1)
workload replay (1)
workspace (1)
xml (1)
 
WELCOME, GUEST
 
 

Blogs
Toad and Database Commentaries

Toad World blogs are a mix of insightful how-tos from Quest experts as well as their commentary on experiences with new database technologies.  Have some views of your own to share?  Post your comments!  Note:  Comments are restricted to registered Toad World users.

Do you have a topic that you'd like discussed?  We'd love to hear from you.  Send us your idea for a blog topic.


Apr 28

Written by: Richard To
Tuesday, April 28, 2009 8:50 AM  RssIcon

This blog is the second in a series about common misconceptions surrounding SQL tuning. It covers the misconception that the goal of SQL tuning is to write a better SQL statement. The real goal of SQL tuning is not to create a better SQL statement, but it is to help the database optimizer to make the right decision when it is choosing the execution plan.

If you browse the internet with the key words “SQL Tuning”, you will find that there are thousands of articles that tell you how to write better SQL and how to read the execution plan. They recommend what is good SQL syntax, or ask you to update the tables/indexes statistics and create new indexes.  Yes, all of these are workable solutions for specific problems, or these are good only for simple problems. But when it comes to a complex SQL statement with many tables and join situations, actually, most of these recommendations are not applicable, since most complex SQL statements are already well written by experienced programmers with a tidy syntax structure. Normally all necessary indexes are built and all the tables’ statistics are updated. Most likely, you won’t find any human introduced errors within these SQL. In reality, the root cause of the performance problems for complex SQL statements is the database internal SQL optimizer. Two major limitations may cause the database SQL optimizer not to find the best way to process your complex SQL:

  • Plan Space is relative small for complex SQL statements 
    For a simple SQL statement, the number of ways (execution plans) to process the SQL statement will be small. But for a complex SQL statement, theoretically, the database SQL optimizer can generate a multitude of execution plans internally to process the SQL statement. The number of execution plans that can be generated by the database SQL optimizer is called the plan space. Due to the time limitation of the database, real time parsing of your SQL statement and the limited syntax rewrite ability, the database SQL optimizer cannot consider all possible execution plans. For simple SQL statements, having a small plan space is acceptable since not many execution plans can be generated. But for complex SQL statements, the number of actual execution plans that will be generated by the database SQL Optimizer will be relatively small compared to the potentially huge number of execution plans that could be generated. So, the likelihood that the database SQL optimizer can select the best query plan will significantly decrease for complex SQL.
     
  • Cost estimation is not accurate
    In my last blog “10 common misconceptions in SQL Tuning #1”, I mentioned that we cannot determine whether a SQL statement will or will not have good performance based on the database SQL optimizer cost estimation. It is a very common misconception that people always think that 100% correct database statistics will result in 100% query plan cardinality estimation and 100% correct cardinality estimation will result in 100% cost estimation. Some people cannot even distinguish the difference between cardinality estimation and cost estimation.  There are many reasons that contribute to why the database SQL optimizer cannot produce a 100% accurate cost estimation. So, within the limited plan space that is generated by the database SQL optimizer that I described above, plus inaccurate cost estimation, it is really hard to guarantee that the database SQL optimizer will provide a good performing execution plan for every SQL statement.

I am not saying that a simple SQL statement does not need to be tuned, because sometimes the cost estimations are exceptionally bad under certain conditions that make the database SQL optimizer select a poorly performing plan. No matter how good looking your SQL syntax structure is, you may need to restructure your SQL with Oracle optimization hints or rewrite the syntax. My goal is not to teach you which syntax is better. That really is meaningless, since every database has its own unique data distribution and statistics. The same SQL syntax in various individual databases and different database versions will have different behavior. If you can read the execution plan, you may know what is causing the performance problem and make corresponding syntax changes and use hints to improve your SQL. But the goal of restructuring is not to write a better-looking SQL. The objective is to fool or guide the database SQL optimizer to select a better plan. I have discussed those tactics previously in my blog (please refer to the following links).  So, don’t be surprised, next time, if you find an ugly SQL statement generated by our Quest SQL Optimizer that is performing a hundred times faster than your SQL statement!

Categories:
Search Blog Entries