Search code examples
sqlperformanceoracle11gparallel-processingcost-based-optimizer

Reasons for Oracle Automatic Degree of Parallelism?


I apologise in advance as I am new to this area and that I may not be providing all the required information up front but here goes.

  • I am on a two node Oracle RAC.
  • Optimizer stats have been recently collected and are very accurate.
  • I have a query where 3 tables are referenced. (Table A left outer join Table B on X left outer join Table C on Z.)
  • Table B and C are partitioned.
  • All three tables have a degree of 1.
  • select index_name from dba_indexes where degree != 1 and index_name not like 'SYS%' returns no rows. (Therefore indexes have degree of 1).
  • I have the following parameters set:

.

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
optimizer_dynamic_sampling           integer     2
optimizer_features_enable            string      11.2.0.3
optimizer_index_caching              integer     0
optimizer_index_cost_adj             integer     100
optimizer_mode                       string      ALL_ROWS
optimizer_secure_view_merging        boolean     TRUE
optimizer_use_invisible_indexes      boolean     FALSE
optimizer_use_pending_statistics     boolean     FALSE
optimizer_use_sql_plan_baselines     boolean     TRUE
os_authent_prefix                    string
os_roles                             boolean     FALSE

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
parallel_adaptive_multi_user         boolean     FALSE
parallel_automatic_tuning            boolean     FALSE
parallel_degree_limit                string      CPU
parallel_degree_policy               string      MANUAL
parallel_execution_message_size      integer     16384
parallel_force_local                 boolean     FALSE
parallel_instance_group              string
parallel_io_cap_enabled              boolean     FALSE
parallel_max_servers                 integer     960
parallel_min_percent                 integer     0
parallel_min_servers                 integer     0

With

  • all degrees of tables and indexes set to 1
  • parallel_degree_policy set to MANUAL
  • no hints are provided at the query

What could be possible reasons, when running an explain plan, for my automatic DOP: Computed Degree of Parallelism to be calculated as 3?


Solution

  • Look at my answer here for a list of 38 factors that can influence the degree of parallelism.

    But luckily most of those items will only lower the DOP, there aren't many ways to unexpectedly raise the DOP.

    With the information you have provided I think there are only two possible items that may cause the parallelism:

    1. alter session force parallel (query|dml|ddl); Use this query to check for a session-level force: select * from v$session where pq_status = 'FORCED' or pdml_status = 'FORCED' or pddl_status = 'FORCED';.
    2. Plan management that is secretly replacing your query with a hinted query. There could be a profile, outline, SQL Plan Management, or advanced rewrite that is adding a parallel hint. Check the explain plan with explain plan for ... and select * from table(dbms_xplan.display);. The Notes section will likely tell you if one of those options was used.