Vladimir Dmitrienko created IGNITE-24767:
--------------------------------------------

             Summary: [SQL] IndexScan is never used when a cached execution 
plan relies on TableScan
                 Key: IGNITE-24767
                 URL: https://issues.apache.org/jira/browse/IGNITE-24767
             Project: Ignite
          Issue Type: Bug
          Components: sql
    Affects Versions: 3.0.0-beta1, 3.0
         Environment: 3 nodes (each node is CMG, each node 
{color:#067d17}"-Xms4096m"{color}, {color:#067d17}"-Xmx4096m"{color}), each on 
separate host. Each host vCPU: 4, Memory: 32GB.
            Reporter: Vladimir Dmitrienko


After the implementation of IGNITE-24307, the IndexScan is only used after the 
statistics have been updated. This update occurs once per minute, meaning that 
up to one minute may pass before an index becomes usable after being added. 
However, if the query execution plan relying on TableScan has been cached, the 
IndexScan will never be used unless the cluster is reinitialized or the 
{{FORCE_INDEX}} hint is applied.

This leads to a situation where a user will not see any performance gains for a 
particular query after adding an index. See the following cases:

*Case 1. Query executed before an Index was created uses TableScan forever:*

 
{code:java}
// 1. Create a table.
CREATE TABLE IF NOT EXISTS table_1 (id int primary key, field_1 int);

// 2. Add at least 5 rows (as we need more than 4 rows for index to be used).
INSERT INTO table_1 VALUES (1, 1);
INSERT INTO table_1 VALUES (2, 2);
INSERT INTO table_1 VALUES (3, 3);
INSERT INTO table_1 VALUES (4, 4);
INSERT INTO table_1 VALUES (5, 5);

// 3. Query by one of these rows: 
EXPLAIN PLAN FOR SELECT field_1 FROM table_1 WHERE field_1 = 3;

// 4. Add index:
CREATE INDEX IF NOT EXISTS field_1_index ON table_1 (field_1 ASC);

// 5. Wait for 1 minute until statistics updated.

// 6. Run the same query:
EXPLAIN PLAN FOR SELECT field_1 FROM table_1 WHERE field_1 = 3;{code}
*Actual result:* TableScan used.

*Expected result:* IndexScan used.

*Note:* querying by an another row yields IndexScan as the query hasn't been 
cached before. 

*Case 2. The first query executed after an Index was created* {*}uses TableScan 
forever:{*}{*}{*}
{code:java}
// 1. Create a table.
CREATE TABLE IF NOT EXISTS table_1 (id int primary key, field_1 int);

// 2. Add index:
CREATE INDEX IF NOT EXISTS field_1_index ON table_1 (field_1 ASC);

// 3. Add at least 5 rows (as we need more than 4 rows for index to be used).
INSERT INTO table_1 VALUES (1, 1);
INSERT INTO table_1 VALUES (2, 2);
INSERT INTO table_1 VALUES (3, 3);
INSERT INTO table_1 VALUES (4, 4);
INSERT INTO table_1 VALUES (5, 5);

// 4. Wait for 1 minute until statistics updated.

// 5. Query by one of table rows: 
EXPLAIN PLAN FOR SELECT field_1 FROM table_1 WHERE field_1 = 3;{code}
*Actual result:* TableScan used.

*Expected result:* IndexScan used.

*Note:* querying by an another row yields Index scan.

 



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

Reply via email to