Skip to Main Content

Database Software

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

How can you keep this SDO_NN process parallel?

B HallOct 24 2017 — edited Oct 30 2017

The table survey_files_with_lat_long has about 11.5 million rows with a shape type of 2D point.

I'm running this on 12.2 - with all objects set to degree default. So with this SQL:

  SELECT /*+ ORDERED PARALLEL */

         s.well_number,

         '10 MILE' AS radius,

         sdo_nn_distance (1) distance_in_feet,

         s.latitude,

         s.longitude,

         s2.well_number neighboring_well_number,

         s2.latitude neighboring_latitude,

         s2.longitude neighboring_longitude

    FROM insite.survey_files_with_lat_long s,

         insite.survey_files_with_lat_long s2

   WHERE s.md = 0

     AND s2.md = 0

     AND s.well_number <> s2.well_number

     AND sdo_nn (s2.geo_point,

                 s.geo_point,

                 'distance=52800 unit=foot sdo_max_memory=1000000',

                 1) = 'TRUE'

ORDER BY sdo_nn_distance (1);

I get the expected resulting plan:

---------------------------------------------------------------------------------------------------------------------------------------------------------

| Id  | Operation                                 | Name                          | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |    TQ  |IN-OUT| PQ Distrib |

---------------------------------------------------------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                          |                               |        |       | 53959 (100)|          |        |      |            |

|   1 |  PX COORDINATOR                           |                               |        |       |            |          |        |      |            |

|   2 |   PX SEND QC (ORDER)                      | :TQ10001                      |    306 | 73440 | 53959   (1)| 00:00:03 |  Q1,01 | P->S | QC (ORDER) |

|   3 |    SORT ORDER BY                          |                               |    306 | 73440 | 53959   (1)| 00:00:03 |  Q1,01 | PCWP |            |

|   4 |     PX RECEIVE                            |                               |    306 | 73440 | 53958   (1)| 00:00:03 |  Q1,01 | PCWP |            |

|   5 |      PX SEND RANGE                        | :TQ10000                      |    306 | 73440 | 53958   (1)| 00:00:03 |  Q1,00 | P->P | RANGE      |

|   6 |       NESTED LOOPS                        |                               |    306 | 73440 | 53958   (1)| 00:00:03 |  Q1,00 | PCWP |            |

|   7 |        PX BLOCK ITERATOR                  |                               |        |       |            |          |  Q1,00 | PCWC |            |

|*  8 |         TABLE ACCESS FULL                 | SURVEY_FILES_WITH_LAT_LONG    |    554 | 66480 |   592   (1)| 00:00:01 |  Q1,00 | PCWP |            |

|   9 |        TABLE ACCESS BY INDEX ROWID BATCHED| SURVEY_FILES_WITH_LAT_LONG    |      1 |   120 | 53958   (1)| 00:00:03 |  Q1,00 | PCWP |            |

|  10 |         BITMAP CONVERSION TO ROWIDS       |                               |        |       |            |          |  Q1,00 | PCWP |            |

|  11 |          BITMAP AND                       |                               |        |       |            |          |  Q1,00 | PCWP |            |

|  12 |           BITMAP CONVERSION FROM ROWIDS   |                               |        |       |            |          |  Q1,00 | PCWP |            |

|  13 |            SORT ORDER BY                  |                               |        |       |            |          |  Q1,00 | PCWP |            |

|* 14 |             INDEX RANGE SCAN              | IDX_SURVEY_FILES_WITH_LL_MDWN |    554 |       |     4   (0)| 00:00:01 |  Q1,00 | PCWP |            |

|  15 |           BITMAP CONVERSION FROM ROWIDS   |                               |        |       |            |          |  Q1,00 | PCWP |            |

|  16 |            SORT ORDER BY                  |                               |        |       |            |          |  Q1,00 | PCWP |            |

|  17 |             DOMAIN INDEX (SEL: 0.100000 %)| SURVEY_FILES_WITH_LAT_LO_SIDX |    554 |       |   122   (0)| 00:00:01 |  Q1,00 |      |            |

---------------------------------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   8 - access(:Z>=:Z AND :Z<=:Z)

       filter("S"."MD"=0)

  14 - access("S2"."MD"=0)

       filter(("S"."WELL_NUMBER"<>"S2"."WELL_NUMBER" AND "S2"."MD"=0))

Note

-----

   - Degree of Parallelism is 96 because of table property

   - Warning: basic plan statistics not available. These are only collected when:

       * hint 'gather_plan_statistics' is used for the statement or

       * parameter 'statistics_level' is set to 'ALL', at session or system level

However, when I go to insert the results in a table with this added on (with or without parallel or append or memory parameter), it always runs serial:

  insert   /+* APPEND */

  into  insite.grid_calc_result_wellbores2 (  well_number,

                                                            radius,

                                                            distancein_feet,

                                                            latitude,

                                                            longitude,

                                                            neighboring_well_number,

                                                            neighboring_latitude,

                                                            neighboring_longitude)

  SELECT /+* ORDERED PARALLEL */

         s.well_number,

         '10 MILE' AS radius,

         sdo_nn_distance (1) distance_in_feet,

         s.latitude,

         s.longitude,

         s2.well_number neighboring_well_number,

         s2.latitude neighboring_latitude,

         s2.longitude neighboring_longitude

    FROM insite.survey_files_with_lat_long s,

         insite.survey_files_with_lat_long s2

   WHERE s.md = 0

     AND s2.md = 0

     AND s.well_number <> s2.well_number

     AND sdo_nn (s2.geo_point,

                 s.geo_point,

                 'distance=52800 unit=foot sdo_max_memory=1000000',

                 1) = 'TRUE'

ORDER BY sdo_nn_distance (1);

Plan:

-------------------------------------------------------------------------------------------------------------------------

| Id  | Operation                              | Name                          | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |

-------------------------------------------------------------------------------------------------------------------------

|   0 | INSERT STATEMENT                       |                               |        |       | 86634 (100)|          |

|   1 |  LOAD TABLE CONVENTIONAL               | GRID_CALC_RESULT_WELLBORES2   |        |       |            |          |

|   2 |   SORT ORDER BY                        |                               |    306 | 73440 | 86634   (1)| 00:00:04 |

|   3 |    NESTED LOOPS                        |                               |    306 | 73440 | 86633   (1)| 00:00:04 |

|   4 |     TABLE ACCESS BY INDEX ROWID BATCHED| SURVEY_FILES_WITH_LAT_LONG    |    554 | 66480 |   560   (0)| 00:00:01 |

|*  5 |      INDEX RANGE SCAN                  | IDX_SURVEY_FILES_WITH_LL_MDWN |    555 |       |     5   (0)| 00:00:01 |

|   6 |     TABLE ACCESS BY INDEX ROWID BATCHED| SURVEY_FILES_WITH_LAT_LONG    |      1 |   120 | 86633   (1)| 00:00:04 |

|   7 |      BITMAP CONVERSION TO ROWIDS       |                               |        |       |            |          |

|   8 |       BITMAP AND                       |                               |        |       |            |          |

|   9 |        BITMAP CONVERSION FROM ROWIDS   |                               |        |       |            |          |

|  10 |         SORT ORDER BY                  |                               |        |       |            |          |

|* 11 |          INDEX RANGE SCAN              | IDX_SURVEY_FILES_WITH_LL_MDWN |    554 |       |     4   (0)| 00:00:01 |

|  12 |        BITMAP CONVERSION FROM ROWIDS   |                               |        |       |            |          |

|  13 |         SORT ORDER BY                  |                               |        |       |            |          |

|  14 |          DOMAIN INDEX (SEL: 0.100000 %)| SURVEY_FILES_WITH_LAT_LO_SIDX |    554 |       |   122   (0)| 00:00:01 |

-------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   5 - access("S"."MD"=0)

  11 - access("S2"."MD"=0)

       filter(("S"."WELL_NUMBER"<>"S2"."WELL_NUMBER" AND "S2"."MD"=0))

Note

-----

   - Warning: basic plan statistics not available. These are only collected when:

       * hint 'gather_plan_statistics' is used for the statement or

       * parameter 'statistics_level' is set to 'ALL', at session or system level

So the question is - how can I run SDO_NN in parallel for this essentially N*N problem to get good performance - and store the results?

Bryan

Comments

Locked Post
New comments cannot be posted to this locked post.

Post Details

Locked on Nov 27 2017
Added on Oct 24 2017
8 comments
411 views