Overview
Every Oracle execution plan is logically a
tree of row source operators (row sources)A rowsource operator (sometimes called rowsource operation, execution plan operation or just an execution plan line) is:
- Physically just a C function
- ...which calls its child rowsource functions in the execution plan tree
- ...fetches rows returned from the child rowsources (functions)
- ...processes the rows (depending on what kind of rowsource it is)
- ...passes the rows up the tree to parent rowsources
- ...once the rows reach the root in the execution plan tree, they are returned back to fetch call which sends them back to the client (in case of a SELECT statement). In case of DML statements, the root rowsource function is the one which performs the required changes on the rows returned to the tree (update, delete).
Note that a few rowsources in Oracle are "hidden", these are not listed here (nor in explain plan / V$SQL_PLAN output).
An example of a hidden rowsource is the Statistics rowsource, which measures time and passes rows through from its child operator. The usage of hidden rowsources can be detected using OS level tools like Tanel's os_explain command. Another hidden rowsource is a plain filter rowsource, which throws away rows not matching the filter condition. This filter rowsource does not show up as FILTER operation (which is a different thing), but is rather just shown as "filter -" in the
predicate section of execution plan output.
Different operations do different things and they only know how to do "their thing". For example, a TABLE ACCESS operation does not know how walk an index and find ROWID's from there, instead the TABLE ACCESS will call INDEX rowsource which walks the index structure and returns a list of ROWID's (physical row addresses) to the TABLE ACCESS. Then the TABLE ACCESS uses these ROWIDs to fetch their corresponding rows from their physical locations.
Many
operators also have
options which affect how exactly the operator works. For example INDEX operator has options such as UNIQUE, RANGE SCAN, SKIP SCAN etc, which determine the way the INDEX operator internally works.
Starting from Oracle 11.1 it is possible to list all (non-hidden) rowsources available by querying
X$XPLTON (eXPLain rowsource Operator Names).
The rowsource operator options are listed in
X$XPLTOO (eXPLain rowsource Operator Options). Starting from Oracle 11.2, the same data can be queried from AWR views DBA_HIST_PLAN_OPERATION_NAME and DBA_HIST_PLAN_OPTION_NAME.
Oracle Rowsource Operator Name list
- BITMAP KEY ITERATION
- NESTED LOOPS
- MERGE JOIN
- HASH JOIN
- AND-EQUAL
- BITMAP AND
- INTERSECTION
- MINUS
- BITMAP MINUS
- GENERATE
- BITMAP CONVERSION
- BITMAP INDEX
- CONNECT BY
- CONNECT BY PUMP
- COUNT
- DELETE
- UPDATE
- FIRST ROW
- FILTER
- FOR UPDATE
- FIXED TABLE
- INLIST ITERATOR
- INDEX
- INDEX BUILD
- LOAD AS SELECT
- MULTI-TABLE INSERT
- INTO
- DIRECT LOAD INTO
- COLLECTION ITERATOR
- DOMAIN INDEX
- PARTITION RANGE
- PARTITION HASH
- PARTITION LIST
- PARTITION SYSTEM
- PARTITION COMBINED
- GRANULE ITERATOR
- SEQUENCE
- TABLE ACCESS
- TABLE QUEUE
- INDEX MAINTENANCE
- FIFO BUFFER
- WINDOW
- TEMP TABLE TRANSFORMATION
- SORT
- BUFFER
- BITMAP COMPACTION
- BITMAP CONSTRUCTION
- BITMAP OR
- BITMAP MERGE
- CONCATENATION
- UNION-ALL
- VIEW PUSHED PREDICATE
- VIEW
- REMOTE
- SELECT STATEMENT
- INSERT STATEMENT
- UPDATE STATEMENT
- MERGE STATEMENT
- DELETE STATEMENT
- CREATE TABLE STATEMENT
- ALTER INDEX STATEMENT
- CREATE INDEX STATEMENT
- DDL STATEMENT
- TEMP TABLE GENERATION
- TRUNCATE TEMP TABLE
- RECURSIVE EXECUTION
- MERGE
- EXTERNAL TABLE ACCESS
- BITMAP JOIN INDEX UPDATE
- BITMAP JOIN INDEX UPDATE STATEMENT
- VIEW HIERARCHY
- SQL MODEL
- MAT_VIEW ACCESS
- MAT_VIEW REWRITE ACCESS
- FREQUENT ITEMSET COUNTING
- FIC ENUMERATE FEED
- FIC LOAD BITMAPS
- FIC LOAD ITEMSETS
- FIC DETECT END
- FIC RECURSIVE ITERATION
- DOMAIN INDEX BUILD
- DOMAIN INDEX PARTITION BUILD
- FAST DUAL
- REFERENCE MODEL
- PX RECEIVE
- QC SEND
- PX SEND
- PX COORDINATOR
- PX BLOCK
- PX PARTITION RANGE
- PX PARTITION HASH
- PX PARTITION LIST
- WINDOW (IN SQL MODEL)
- UNION ALL PUSHED PREDICATE
- DST ENUMERATE FEED
- DST DETECT END
- DST RECURSIVE ITERATION
- DST SPLIT
- DECISION TREE CLASSIFICATION
- DST PRUNE
- JOIN FILTER
- HASH
- ERROR LOGGING
- LOAD TABLE CONVENTIONAL
- PART JOIN FILTER
- AW SCAN
- PARTITION REFERENCE
- PX PARTITION REFERENCE
- XPATH EVALUATION
- RESULT CACHE
- DM FEED PREDICTOR-TARGET PAIRS
- DM SUPERVISED BINNING
- DM HASH-BROADCAST COUNTS
- BULK BINDS GET
- APPROXIMATE NDV
- UNPIVOT
- TRANSPOSE
- MONITORING
- CUBE SCAN
- JOINED CUBE SCAN
- CUBE ACCESS
- MAT_VIEW CUBE ACCESS
- MAT_VIEW REWRITE CUBE ACCESS
- CUBE TABLE SCAN
- JOINED CUBE TABLE SCAN
- CUBE TABLE ACCESS
- UNION ALL (RECURSIVE WITH)
- RECURSIVE WITH PUMP
Oracle Rowsource Operator Options list
- OUTER
- ANTI
- SEMI
- CARTESIAN
- TO ROWIDS
- FROM ROWIDS
- COUNT
- SINGLE VALUE
- SAMPLE FAST FULL SCAN
- FAST FULL SCAN
- FULL SCAN
- RANGE SCAN
- UNIQUE SCAN
- SKIP SCAN
- FULL SCAN (MIN/MAX)
- RANGE SCAN (MIN/MAX)
- FULL SCAN DESCENDING
- RANGE SCAN DESCENDING
- SKIP SCAN DESCENDING
- WITH FILTERING
- WITHOUT FILTERING
- STOPKEY
- FIXED INDEX
- FULL
- HASH
- INDEX BUILD
- UNIQUE (LOCAL)
- NON UNIQUE (LOCAL)
- UNIQUE
- NON UNIQUE
- PICKLER FETCH
- CONSTRUCTOR FETCH
- SUBQUERY FETCH
- REMOTE
- SAMPLE
- SAMPLE BY ROWID RANGE
- BY ROWID RANGE
- BY LOCAL INDEX ROWID
- BY GLOBAL INDEX ROWID
- BY INDEX ROWID
- BY USER ROWID
- CLUSTER
- NOSORT
- BUFFER PUSHED RANK
- BUFFER
- CHILD PUSHED RANK
- CHILD
- SORT PUSHED RANK
- SINGLE
- EMPTY
- INLIST
- ALL
- ITERATOR
- PARTITION
- AGGREGATE
- GROUP BY STOPKEY
- GROUP BY
- UNIQUE NOSORT
- GROUP BY NOSORT
- GROUP BY ROLLUP
- CUBE
- ROLLUP
- SORT
- CREATE INDEX
- UNIQUE STOPKEY
- ORDER BY STOPKEY
- ORDER BY
- JOIN
- GROUP BY NOSORT ROLLUP
- CUSTOM OPTION
- ROWID RANGE
- EXTERNAL CHUNK
- ACYCLIC
- CYCLIC
- ACYCLIC FAST
- ORDERED
- ORDERED FAST
- RIGHT OUTER
- RIGHT ANTI
- RIGHT SEMI
- PARTITION OUTER
- (LOCAL)
- PARTITION (ROWID)
- PARTITION (KEY)
- RANGE
- ROUND-ROBIN
- BROADCAST
- QC (ORDER)
- QC (RANDOM)
- BROADCAST LOCAL
- HASH LOCAL
- HYBRID (ROWID PKEY)
- RANDOM LOCAL
- HASH (BLOCK ADDRESS)
- MIXED HASH BCAST LOCAL
- MIXED HASH BCAST
- OUTER BUFFERED
- RIGHT OUTER BUFFERED
- ANTI BUFFERED
- RIGHT ANTI BUFFERED
- SEMI BUFFERED
- RIGHT SEMI BUFFERED
- CARTESIAN BUFFERED
- PARTITION OUTER BUFFERED
- HASH ALL
- RANGE ALL
- LIST
- LIST ALL
- SYSTEM
- FORCED SERIAL
- PARTITION JOIN
- AW HASH
- CREATE
- USE
- SUBQUERY
- OR
- MULTI-COLUMN
- NOSORT STOPKEY
- BUFFERED
- FULL OUTER
- FULL OUTER BUFFERED
- NO FILTERING WITH START-WITH
- JOIN-FILTER
- ANTI NA
- ANTI SNA
- ANTI NA BUFFERED
- ANTI SNA BUFFERED
- RIGHT ANTI NA
- RIGHT ANTI SNA
- RIGHT ANTI NA BUFFERED
- RIGHT ANTI SNA BUFFERED
- GROUP BY PIVOT
- GROUP BY NOSORT PIVOT
- DUMP
- VERIFY
- STRIP
- STORAGE FULL
- STORAGE SAMPLE
- STORAGE SAMPLE BY ROWID RANGE
- STORAGE BY ROWID RANGE
- PARTIAL OUTER
- OPTIMIZED
- SPECIFIED
- STORAGE SAMPLE FAST FULL SCAN
- STORAGE FAST FULL SCAN
- STORAGE FULL SCAN
- STORAGE RANGE SCAN
- STORAGE FULL SCAN (MIN/MAX)
- WITH FILTERING (UNIQUE)
- WITHOUT FILTERING (UNIQUE)
- NO FILTERING WITH SW (UNIQUE)
- BREADTH FIRST
- DEPTH FIRST
- AND
I will (slowly) start adding additional documentation about these operators and options here... Feel free to request which ones I should document first at the
Oracle Living Book entry page