Learning more about and reading 10053 trace files

  • From: "Charles Schultz" <sacrophyte@xxxxxxxxx>
  • To: "Oracle-L Freelists" <oracle-l@xxxxxxxxxxxxx>
  • Date: Tue, 5 Sep 2006 11:19:55 -0500

With a helpful nod towards Wolfgang Breitling's and Jonathan Lewis's works,
I am trying to analyze a particular scenario where a "select distinct" is
being outfitted with a Full Table Scan (FTS) and takes much longer than its
"select /* no distinct */" cousin. I understand that conceptually the
statement with a distinct will have to group and sort the resulting rows,
but I am having a hard time understanding relevant parts of the 10053 trace.
One specific aspect of the trace file has me boggled, but let me start with
a little background from the trace file.

First, the "First K Rows: Setup begin/end" section. Here are the last few
lines from each query:
WITH DISTINCT
GROUP BY cardinality:  403084.00, TABLE cardinality:  403084.00
   SORT resource      Sort statistics
     Sort width:         238 Area size:      208896 Max Area size:
41943040
     Degree:               1
     Blocks to Sort:    2567 Row size:           52 Total Rows:
403084
     Initial runs:         2 Merge passes:        1 IO Cost / pass:
1424
     Total IO sort cost: 3991      Total CPU sort cost: 402383422
     Total Temp space used: 38872000
Final - All Rows Plan:  Best join order: 1
 Cost: 341814.3073  Degree: 1  Card: 403084.0000  Bytes: 15317192
 Resc: 341814.3073  Resc_io: 274398.0000  Resc_cpu: 67534690293
 Resp: 341814.3073  Resp_io: 274398.0000  Resc_cpu: 67534690293

WITHOUT DISTINCT
Final - All Rows Plan:  Best join order: 1
 Cost: 337421.6292  Degree: 1  Card: 403084.0000  Bytes: 15317192
 Resc: 337421.6292  Resc_io: 270407.0000  Resc_cpu: 67132306871
 Resp: 337421.6292  Resp_io: 270407.0000  Resc_cpu: 67132306871

So far, so good - it makes sense that it takes a little extra effort to sort
and group the DISTINCT. But in the rest of the trace for the DISTINCT query,
there are absolutely no calculations for "First K Rows", whereas the
nondistinct query has a cost comparison for every conceivable "SINGLE TABLE
ACCESS PATH (First K Rows)". Why is this? In the join order that was
eventually chosen (happened to be Join Order 10 in both cases), the trace
for both queries are exactly the same, up until the nondistinct query starts
to work on the "First K Rows" part. Well, actually, now that I look at it a
second time, the distinct trace has 2 extra lines, each a "Grouping column
Cardinality" cost, which I am having a hard time finding relevance for (the
raw number is not used anywhere else). Perhaps that is key to understanding
and unraveling this little mystery, but I am still confused as to how.

This is more a curiosity on my own part than anything else. I am more than
happy to forward the trace files to anyone who wants to look at them, but I
am not expecting anyone to "solve" the problem. I am just trying to learn
the concepts.

PS - I have read "Under the Hood of the 10053 trace" and JL's "Cost-Based
Oracle Fundamentals" - if you know of a particular section that would help
me understand, please mention a page number.

--
Charles Schultz

Other related posts: