[ 
https://issues.apache.org/jira/browse/IGNITE-25366?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Konstantin Orlov reassigned IGNITE-25366:
-----------------------------------------

    Assignee: Konstantin Orlov

> Documentation. Describe output of EXPLAIN command
> -------------------------------------------------
>
>                 Key: IGNITE-25366
>                 URL: https://issues.apache.org/jira/browse/IGNITE-25366
>             Project: Ignite
>          Issue Type: Improvement
>          Components: documentation ai3
>            Reporter: Konstantin Orlov
>            Assignee: Konstantin Orlov
>            Priority: Major
>              Labels: ignite-3
>
> Let's update documentation with page describing general concept of EXPLAIN 
> output, which is provided below.
> Every relational operator is described with a name and set of attributes:
> {code}
> NameOfTheRelationalOperator
>     attribute1: value1
>     attribute2: value2
> {code}
> Let’s take a look at few examples:
> {code}
> TableScan                        // Full table access
>     table: PUBLIC.EMP1           // Name of the table in question
>     fields: [NAME, SALARY]       // List of columns to return
>     est: (rows=1)                // Estimated number of rows returned
> IndexScan                        // Index scan
>     table: PUBLIC.TEST_TBL       // Name of the table in question
>     index: IDX_DESC              // Name of the index in question
>     type: SORTED                 // Type of the index
>     fields: [C1]                 // List of columns to return
>     collation: [C1 DESC]         // Collation of the index aka order of 
> sorting
>     est: (rows=1)                // Estimated number of rows returned
> Sort
>     collation: [C1 DESC NULLS LAST] // Collation to sort input rows
>     est: (rows=1)                   // Estimated number of rows returned
> {code}
> Name represents a particular algorithm used to execute relation operators 
> ({{TableScan}} vs {{IndexScan}}, {{HashJoin}} vs {{MergeJoin}} vs 
> {{NestedLoopJoin}}, etc). The set of attributes depends on the particular 
> relational operator.
> A query plan is represented by a tree-like structure which is the composition 
> of nodes described above. This tree describes a data flow, where rows are 
> passed from leaves to a plan root node (root node is the topmost node, it 
> also has no indentation). Let's take a look at few examples:
> {code}
> // simple ordered select where desired order matches collation of existing 
> index
> EXPLAIN PLAN FOR SELECT c1 FROM test_tbl ORDER BY c1 DESC NULLS FIRST
> Exchange
>     distribution: single
>     est: (rows=1)
>   IndexScan
>       table: PUBLIC.TEST_TBL
>       index: IDX_DESC
>       type: SORTED
>       fields: [C1]
>       collation: [C1 DESC]
>       est: (rows=1)
> // similar query, but desired order doesn't match index collation. Mind the 
> additional
> // SORT node.
> EXPLAIN PLAN FOR SELECT c1 FROM test_tbl ORDER BY c1 DESC NULLS LAST
> Exchange
>     distribution: single
>     est: (rows=1)
>   Sort
>       collation: [C1 DESC NULLS LAST]
>       est: (rows=1)
>     TableScan
>         table: PUBLIC.TEST_TBL
>         fields: [C1]
>         est: (rows=1)
> // Mind the "fetch" attribute of Sort node. It denotes TopN sort algorithm,
> // implying that only N nodes will be kept in memory. This also implies
> // that only N rows from every node will be transferred over Exchange.  
> SELECT * FROM test ORDER BY pk FETCH FIRST ? ROWS ONLY
> Limit
>     fetch: ?0
>     est: (rows=1)
>   Exchange
>       distribution: single
>       est: (rows=1)
>     Sort
>         collation: [PK ASC]
>         fetch: ?0
>         est: (rows=1)
>       TableScan
>           table: PUBLIC.TEST
>           fields: [PK, COL0]
>           est: (rows=1)
> // Similar query, but Limit node wasn't pushed down the exchange. This implies
> // that the whole dataset will be transferred over an Exchange.
> SELECT * FROM test OFFSET ? ROWS FETCH FIRST ? ROWS ONLY 
> Limit
>     offset: ?0
>     fetch: ?1
>     est: (rows=1)
>   Exchange
>       distribution: single
>       est: (rows=1)
>     TableScan
>         table: PUBLIC.TEST
>         fields: [PK, COL0]
>         est: (rows=1)
> // More complex plan
> EXPLAIN PLAN FOR SELECT 
>     U.UserName, P.ProductName, R.ReviewText, R.Rating
>  FROM Users U, Reviews R, Products P
> WHERE U.UserID = R.UserID
>   AND R.ProductID = P.ProductID
>   AND P.ProductName = 'Product_' || ?::varchar;
> Project
>     fields: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]
>     exprs: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]
>     est: (rows=16650)
>   HashJoin
>       condition: =(USERID0, USERID)
>       joinType: inner
>       est: (rows=16650)
>     HashJoin
>         condition: =(PRODUCTID, PRODUCTID0)
>         joinType: inner
>         est: (rows=16650)
>       Exchange
>           distribution: single
>           est: (rows=50000)
>         TableScan
>             table: PUBLIC.REVIEWS
>             fields: [PRODUCTID, USERID, REVIEWTEXT, RATING]
>             est: (rows=50000)
>       Exchange
>           distribution: single
>           est: (rows=1)665
>         TableScan
>             table: PUBLIC.PRODUCTS
>             filters: =(PRODUCTNAME, ||(_UTF-8'Product_', CAST(?0):VARCHAR 
> CHARACTER SET "UTF-8"))
>             fields: [PRODUCTID, PRODUCTNAME]
>             est: (rows=1665)
>     Exchange
>         distribution: single
>         est: (rows=10000)
>       TableScan
>           table: PUBLIC.USERS
>           fields: [USERID, USERNAME]
>           est: (rows=10000)
> {code}
> We also should provide exhaustive list of relational operators their 
> attributes.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to