RE: Exadata Tuning Question+

  • From: "Ebadi, Abdul" <Abdul.Ebadi@xxxxxxxxxx>
  • To: Iggy Fernandez <iggy_fernandez@xxxxxxxxxxx>, ORACLE-L <oracle-l@xxxxxxxxxxxxx>
  • Date: Tue, 11 Nov 2014 16:04:06 +0000

First one:

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 395663814

-------------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                 | Rows  | Bytes 
|TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                      |   231M|     9G|   
    |  2777K  (1)| 00:01:49 |
|   1 |  SORT GROUP BY               |                      |   231M|     9G|   
 12G|  2777K  (1)| 00:01:49 |
|*  2 |   HASH JOIN OUTER            |                      |   231M|     9G|   
251M| 94000   (3)| 00:00:04 |
|*  3 |    HASH JOIN RIGHT OUTER     |                      |  7331K|   167M|   
 54M| 40013   (3)| 00:00:02 |
|   4 |     TABLE ACCESS STORAGE FULL| SERVICE_LOCATION     |  3175K|    18M|   
    |  5150   (1)| 00:00:01 |
|   5 |     TABLE ACCESS STORAGE FULL| SERVICE_LOOKUP       |  7331K|   125M|   
    | 21669   (4)| 00:00:01 |

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|*  6 |    TABLE ACCESS STORAGE FULL | SERVICE_RELATIONSHIP |    21M|   454M|   
    |  5421   (8)| 00:00:01 |


Second one:
Plan hash value: 3504593807

-------------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                 | Rows  | Bytes 
|TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                      |  7331K|    69G|   
    |   194K  (2)| 00:00:08 |
|*  1 |  HASH JOIN OUTER             |                      |  7331K|    69G|   
251M|   194K  (2)| 00:00:08 |
|*  2 |   HASH JOIN RIGHT OUTER      |                      |  7331K|   167M|   
 54M| 40013   (3)| 00:00:02 |
|   3 |    TABLE ACCESS STORAGE FULL | SERVICE_LOCATION     |  3175K|    18M|   
    |  5150   (1)| 00:00:01 |
|   4 |    TABLE ACCESS STORAGE FULL | SERVICE_LOOKUP       |  7331K|   125M|   
    | 21669   (4)| 00:00:01 |
|   5 |   VIEW                       |                      |   176K|  1695M|   
    | 57660   (3)| 00:00:03 |

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   6 |    SORT GROUP BY             |                      |   176K|  3781K|   
663M| 57660   (3)| 00:00:03 |
|*  7 |     TABLE ACCESS STORAGE FULL| SERVICE_RELATIONSHIP |    21M|   454M|   
    |  5421   (8)| 00:00:01 |
-------------------------------------------------------------------------------------------------------------

Thanks,
Abdul
From: Iggy Fernandez [mailto:iggy_fernandez@xxxxxxxxxxx]
Sent: Tuesday, November 11, 2014 5:29 AM
To: Ebadi, Abdul; ORACLE-L
Subject: RE: Exadata Tuning Question+

Reposting since my reply was not posted

Abdul,

I cannot understand why the number of rows exploded from 21 million to 206 
million in line 2. Surely, the number of rows cannot be more 21M because SID is 
(or appears to be) the primary key of SERVICE_LOOKUP and has a foreign key 
relationship to with SERVICE_RELATIONSHIP. Perhaps, primary key and foreign key 
constraints are not being enforced. I need to review the join conditions in the 
predicate section of the query plan. Because of the rows explosion, the 
required sort area size is 10G. You can try increasing the sort_area_size to 
10G. A better strategy might be to perform the group by before the join using 
the WITH CLAUSE or the PLACE_GROUP_BY hint.

Could you post the following two EXPLAIN PLAN (including the predicate sections)

EXPLAIN PLAN FOR
SELECT
  slv.sid,
  slv.service_location_id,
  RTRIM(XMLSERIALIZE(CONTENT EXTRACT( XMLAGG(XMLELEMENT("e", 
DECODE(sr.relationship_level, '1', sr.RELATED_SID || ',', NULL)) ORDER BY 
sr.RELATED_SID), '//text()' )) , ',' ) AS relatedserviceinstanceidlevel1,
  RTRIM(XMLSERIALIZE(CONTENT EXTRACT( XMLAGG(XMLELEMENT("e", 
DECODE(sr.relationship_level, '2', sr.RELATED_SID || ',', NULL)) ORDER BY 
sr.RELATED_SID), '//text()' )) , ',' ) AS relatedserviceinstanceidlevel1,
  RTRIM(XMLSERIALIZE(CONTENT EXTRACT( XMLAGG(XMLELEMENT("e", 
DECODE(sr.relationship_level, '3', sr.RELATED_SID || ',', NULL)) ORDER BY 
sr.RELATED_SID), '//text()' )) , ',' ) AS relatedserviceinstanceidlevel1,
  RTRIM(XMLSERIALIZE(CONTENT EXTRACT( XMLAGG(XMLELEMENT("e", 
DECODE(sr.relationship_level, '4', sr.RELATED_SID || ',', NULL)) ORDER BY 
sr.RELATED_SID), '//text()' )) , ',' ) AS relatedserviceinstanceidlevel1,
  RTRIM(XMLSERIALIZE(CONTENT EXTRACT( XMLAGG(XMLELEMENT("e", 
DECODE(sr.relationship_level, '5', sr.RELATED_SID || ',', NULL)) ORDER BY 
sr.RELATED_SID), '//text()' )) , ',' ) AS relatedserviceinstanceidlevel1
FROM
  service_lookup slv
  LEFT OUTER JOIN service_location sl ON sl.service_location_id = 
slv.service_location_id
  LEFT OUTER JOIN service_relationship sr ON sr.sid = slv.sid AND 
sr.relationship_level IN ('1', '2', '3', '4', '5')
GROUP BY slv.id, slv.service_location_id;

EXPLAIN PLAN FOR
WITH sr AS (
  SELECT
    sr.id,
    LISTAGG(DECODE(sr.relationship_level, '1', sr.related_sid, NULL) ',') 
WITHIN GROUP (ORDER BY sr.related_sid) AS relatedserviceinstanceidlevel1,
    LISTAGG(DECODE(sr.relationship_level, '2', sr.related_sid, NULL) ',') 
WITHIN GROUP (ORDER BY sr.related_sid) AS relatedserviceinstanceidlevel2,
    LISTAGG(DECODE(sr.relationship_level, '3', sr.related_sid, NULL) ',') 
WITHIN GROUP (ORDER BY sr.related_sid) AS relatedserviceinstanceidlevel3,
    LISTAGG(DECODE(sr.relationship_level, '4', sr.related_sid, NULL) ',') 
WITHIN GROUP (ORDER BY sr.related_sid) AS relatedserviceinstanceidlevel4,
    LISTAGG(DECODE(sr.relationship_level, '5', sr.related_sid, NULL) ',') 
WITHIN GROUP (ORDER BY sr.related_sid) AS relatedserviceinstanceidlevel5
  WHERE sr.relationship_level IN ('1', '2', '3', '4', '5')
  GROUP BY sr.id
)
SELECT
  slv.sid,
  slv.service_location_id,
  sr.relatedserviceinstanceidlevel1,
  sr.relatedserviceinstanceidlevel2,
  sr.relatedserviceinstanceidlevel3,
  sr.relatedserviceinstanceidlevel4,
  sr.relatedserviceinstanceidlevel5
FROM
  service_lookup slv
  LEFT OUTER JOIN service_location sl ON sl.service_location_id = 
slv.service_location_id
  LEFT OUTER JOIN sr ON sr.sid = slv.sid;


From: Abdul.Ebadi@xxxxxxxxxx<mailto:Abdul.Ebadi@xxxxxxxxxx>
Thanks for the reply Iggy...

Your second suggestion below runs faster, but according to our developer we 
"cannot use LISTAGG as the string is larger than 4000 chars for some of the 
values, so will have to use XMLAGG"
The first suggestion is OK and missing a group by, but when we added group by 
it didn't finish even after long time.

Here is the plan for your second option (even switching to SORT MERGE join 
resulted in same thing - not finished):

Plan hash value: 4110902776

-------------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                 | Rows  | Bytes 
|TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                      |   206M|  9067M|   
    |   151K  (1)| 00:00:06 |
|   1 |  SORT GROUP BY               |                      |   206M|  9067M|   
 10G|   151K  (1)| 00:00:06 |
|*  2 |   HASH JOIN OUTER            |                      |   206M|  9067M|   
    |  2311   (7)| 00:00:01 |
|*  3 |    HASH JOIN                 |                      |  6539K|   149M|   
    |  1864   (4)| 00:00:01 |
|   4 |     TABLE ACCESS STORAGE FULL| SERVICE_LOCATION     |  3175K|    18M|   
    |   357   (1)| 00:00:01 |
|*  5 |     TABLE ACCESS STORAGE FULL| SERVICE_LOOKUP       |  6539K|   112M|   
    |  1503   (4)| 00:00:01 |

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|*  6 |    TABLE ACCESS STORAGE FULL | SERVICE_RELATIONSHIP |    21M|   454M|   
    |   376   (8)| 00:00:01 |
-------------------------------------------------------------------------------------------------------------

Thanks,
Abdul

Other related posts: