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

Evgeny Stanilovsky reassigned IGNITE-25369:
-------------------------------------------

    Assignee: Evgeny Stanilovsky

> Sql. Introduce EXPLAIN MAPPING FOR command
> ------------------------------------------
>
>                 Key: IGNITE-25369
>                 URL: https://issues.apache.org/jira/browse/IGNITE-25369
>             Project: Ignite
>          Issue Type: Improvement
>          Components: sql ai3
>            Reporter: Konstantin Orlov
>            Assignee: Evgeny Stanilovsky
>            Priority: Major
>              Labels: ignite-3
>
> Apache Ignite is distributed system. It has an ability to have several copies 
> of the data named replicas. Therefore, to execute a query, original plan is 
> split on number of fragments, and every fragment is mapped on subset of 
> nodes. It would be beneficial to provide an insight on which nodes will be 
> used to execute which part of the query.
> For this, let's introduce to command {{EXPLAIN MAPPING FOR <queryOrDml>}}. 
> Below is suggested output of the command:
> {code}
> EXPLAIN MAPPING 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;
> Fragment#0 root
>   executionNodes: [ijot_n_3344]
>   plan: 
> Project
>     fields: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]
>     exprs: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]
>     est: (rows=1)
>   HashJoin
>       condition: =(USERID0, USERID)
>       joinType: inner
>       est: (rows=1)
>     HashJoin
>         condition: =(PRODUCTID, PRODUCTID0)
>         joinType: inner
>         est: (rows=1)
>       Receiver
>           rowType: RecordType(INTEGER PRODUCTID, INTEGER USERID, 
> VARCHAR(65536) REVIEWTEXT, INTEGER RATING)
>           exchangeId: 1
>           sourceFragmentId: 1
>           est: (rows=1)
>       Receiver
>           rowType: RecordType(INTEGER PRODUCTID, VARCHAR(100) PRODUCTNAME)
>           exchangeId: 2
>           sourceFragmentId: 2
>           est: (rows=1)
>     Receiver
>         rowType: RecordType(INTEGER USERID, VARCHAR(100) USERNAME)
>         exchangeId: 3
>         sourceFragmentId: 3
>         est: (rows=1)
> Fragment#1
>   targetFragment: 0
>   executionNodes: [ijot_n_3344, ijot_n_3345, ijot_n_3346]
>   plan: 
> Sender
>     exchangeId: 1
>     targetFragmentId: 0
>     distribution: single
>     est: (rows=50000)
>   TableScan
>       table: PUBLIC.REVIEWS
>       fields: [PRODUCTID, USERID, REVIEWTEXT, RATING]
>       sourceId: 6
>       est: (rows=50000)
> Fragment#2
>   targetFragment: 0
>   executionNodes: [ijot_n_3344, ijot_n_3345, ijot_n_3346]
>   plan:
> Sender
>     exchangeId: 2
>     targetFragmentId: 0
>     distribution: single
>     est: (rows=1665)
>   TableScan
>       table: PUBLIC.PRODUCTS
>       filters: =(PRODUCTNAME, ||(_UTF-8'Product_', CAST(?0):VARCHAR CHARACTER 
> SET "UTF-8"))
>       fields: [PRODUCTID, PRODUCTNAME]
>       sourceId: 5
>       est: (rows=1665)
> Fragment#3
>   targetFragment: 0
>   executionNodes: [ijot_n_3344, ijot_n_3345, ijot_n_3346]
>   plan:
> Sender
>     exchangeId: 3
>     targetFragmentId: 0
>     distribution: single
>     est: (rows=10000)
>   TableScan
>       table: PUBLIC.USERS
>       fields: [USERID, USERNAME]
>       sourceId: 4
>       est: (rows=10000)
> {code}
> h3. Implementation Notes
> As a first step, it worth to reuse 
> {{org.apache.ignite.internal.sql.engine.exec.mapping.FragmentPrinter}} as is, 
> and adjust output in follow up ticket (IGNITE-25413).



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

Reply via email to