DEV Community

Pranav Bakare
Pranav Bakare

Posted on

Oracle Query Optimizer

In Oracle SQL, the optimizer is responsible for determining the most efficient way to execute a SQL query. The Oracle Optimizer primarily uses three approaches to make decisions:


  1. Rule-Based Optimizer (RBO) (Deprecated)

How it works:
The Rule-Based Optimizer relies on a set of predefined rules and a fixed ranking system to determine the execution plan. The order of operations and indexes used is based on these static rules.

Characteristics:

Does not consider the size of the data or table statistics.

Uses hard-coded priorities (e.g., always prefers indexed access over full table scans).

Status:
Deprecated and replaced by the Cost-Based Optimizer. No longer recommended or used in modern Oracle databases.


  1. Cost-Based Optimizer (CBO) (Default and Recommended)

How it works:
The Cost-Based Optimizer evaluates the cost of different execution plans and chooses the plan with the lowest cost. The cost is an estimate of the resources (CPU, memory, I/O) required to execute the query.

Factors Considered:

Statistics: Table, index, and column statistics (e.g., row counts, data distribution, etc.).

System Resources: CPU, memory, and disk I/O capabilities.

Indexes: Availability and selectivity of indexes.

Parallelism: Degree of parallelism and system load.

Join Methods: Nested loops, hash joins, or merge joins.

Access Paths: Full table scans, index scans, or unique scans.

Advantages:

Dynamically adapts to data and system conditions.

Optimizes complex queries and large datasets effectively.

Supports advanced features like partitioning, parallelism, and materialized views.

Example Optimizations:

Choosing between a full table scan and an index scan based on table size and filter conditions.

Deciding whether to sort data in memory or use temporary tables on disk.


  1. Adaptive Optimizer (Introduced in Oracle 12c)

How it works:
The Adaptive Optimizer enhances the Cost-Based Optimizer by allowing the execution plan to adjust dynamically during query execution, based on real-time observations.

Key Features:

Adaptive Plans: Adjusts join methods or access paths during execution based on runtime statistics.

Adaptive Statistics: Uses feedback from previous executions to refine future query plans.

Automatic Reoptimization: Modifies execution plans if performance issues are detected.

Use Case:

Queries with unpredictable data distribution or cardinality estimates.

Dynamic systems where workloads vary significantly.


Optimizer Decisions and Execution Plan Components

  1. Access Paths:

Full Table Scan: Scans all rows in the table (preferred for small tables or when no suitable indexes exist).

Index Scan: Uses an index to locate rows (preferred when filters or joins involve indexed columns).

Index Skip Scan: Skips parts of a composite index when not all columns in the index are used.

  1. Join Methods:

Nested Loops Join: Efficient for small datasets or highly selective joins.

Hash Join: Used for large datasets with non-selective joins.

Merge Join: Efficient for sorted data or pre-sorted datasets.

  1. Sort Operations:

The optimizer decides whether sorting should be performed in memory or using temporary disk space.

  1. Parallelism:

Determines if the query should be executed in parallel and the degree of parallelism.

  1. Transformations:

Predicate Pushdown: Moves filters closer to the data source to minimize data retrieval.

Query Rewrite: Rewrites queries to use materialized views or equivalent structures.

  1. Statistics Feedback:

The optimizer adjusts execution plans if runtime statistics differ significantly from estimates.


Influencing the Optimizer

You can influence the optimizer's decisions using hints or by configuring database settings:

Hints: Direct the optimizer to use specific methods (e.g., FULL, INDEX, USE_HASH, PARALLEL).

Statistics: Regularly gather accurate table, column, and index statistics.

Optimizer Parameters:

OPTIMIZER_MODE: Controls the optimizer's behavior (e.g., ALL_ROWS, FIRST_ROWS, RULE).

OPTIMIZER_DYNAMIC_SAMPLING: Controls runtime sampling to improve cardinality estimates.

PARALLEL_DEGREE_POLICY: Determines the automatic use of parallelism.


Key Optimizer Modes

  1. ALL_ROWS:
    Optimizes for throughput, minimizing total resource consumption (ideal for batch processing).

  2. FIRST_ROWS:
    Optimizes for response time, returning the first rows as quickly as possible (ideal for interactive applications).

  3. CHOOSE:
    Automatically selects the mode based on whether table statistics are available.


Conclusion

The Oracle Optimizer is a powerful engine that adapts to the query context, data distribution, and system conditions. It typically defaults to the Cost-Based Optimizer, but you can fine-tune its behavior with hints, statistics, and parameters to meet specific performance requirements.

Top comments (0)