[ https://issues.apache.org/jira/browse/IGNITE-25369?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Konstantin Orlov updated IGNITE-25369: -------------------------------------- Description: 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. was: 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} > 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 > 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. -- This message was sent by Atlassian Jira (v8.20.10#820010)