Skip to content

Conversation

@KKould
Copy link
Member

@KKould KKould commented Jan 14, 2026

What problem does this PR solve?

Add EliminateRedundantSort & PushJoinPredicateIntoScan to helps optimize the main performance issues of OrderStatus.

Before

## Pick matching customer ordered by first name
EXPLAIN SELECT c_balance, c_first, c_middle, c_last FROM customer WHERE c_w_id = 1 AND c_d_id = 1 AND c_last = 'BARBAR' ORDER BY c_first
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| PLAN                                                                                                                                                                                           |
+================================================================================================================================================================================================+
| Projection [customer.c_balance, customer.c_first, customer.c_middle, customer.c_last] [Project]                                                                                                |
|   Sort By customer.c_first Asc Nulls Last [Sort]                                                                                                                                               |
|     Filter (((cast (customer.c_w_id as Integer) = 1) && (cast (customer.c_d_id as Integer) = 1)) && (cast (customer.c_last as Varchar(None, CHARACTERS)) = BARBAR)), Is Having: false [Filter] |
|       TableScan customer -> [c_w_id, c_d_id, c_first, c_middle, c_last, c_balance] [SeqScan]                                                                                                   |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

## Fetch latest order id via correlated MAX subquery
EXPLAIN SELECT o_id, o_entry_d, COALESCE(o_carrier_id,0) FROM orders WHERE o_w_id = 1 AND o_d_id = 1 AND o_c_id = 1001 AND o_id = (SELECT MAX(o_id) FROM orders WHERE o_w_id = 1 AND o_d_id = 1 AND o_c_id = 1001)
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| PLAN                                                                                                                                                                         |
+==============================================================================================================================================================================+
| Projection [orders.o_id, orders.o_entry_d, coalesce(orders.o_carrier_id, 0)] [Project]                                                                                       |
|   Inner Join On orders.o_id = Max(orders.o_id) Where (((cast (orders.o_w_id as Integer) = 1) && (cast (orders.o_d_id as Integer) = 1)) && (orders.o_c_id = 1001)) [HashJoin] |
|     TableScan orders -> [o_id, o_d_id, o_w_id, o_c_id, o_entry_d, o_carrier_id] [SeqScan]                                                                                    |
|     Projection [Max(orders.o_id)] [Project]                                                                                                                                  |
|       Aggregate [Max(orders.o_id)] [SimpleAggregate]                                                                                                                         |
|         Filter (((cast (orders.o_w_id as Integer) = 1) && (cast (orders.o_d_id as Integer) = 1)) && (orders.o_c_id = 1001)), Is Having: false [Filter]                       |
|           TableScan orders -> [o_id, o_d_id, o_w_id, o_c_id] [IndexScan By idx_orders => [(1, 1, 1001), (1, 1, 1001)] Covered]                                               |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

After:

## Pick matching customer ordered by first name
EXPLAIN SELECT c_balance, c_first, c_middle, c_last FROM customer WHERE c_w_id = 1 AND c_d_id = 1 AND c_last = 'BARBAR' ORDER BY c_first
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| PLAN                                                                                                                                                                                                                                                                                                                                   |
+========================================================================================================================================================================================================================================================================================================================================+
| Projection [customer.c_balance, customer.c_first, customer.c_middle, customer.c_last] [Project => (Sort Option: Follow)]                                                                                                                                                                                                               |
|   Filter (((cast (customer.c_w_id as Integer) = 1) && (cast (customer.c_d_id as Integer) = 1)) && (cast (customer.c_last as Varchar(None, CHARACTERS)) = BARBAR)), Is Having: false [Filter => (Sort Option: Follow)]                                                                                                                  |
|     TableScan customer -> [c_w_id, c_d_id, c_first, c_middle, c_last, c_balance] [IndexScan By idx_customer => [(1, 1, BARBAR), (1, 1, BARBAR)] => (Sort Option: OrderBy: (customer.c_w_id Asc Nulls First, customer.c_d_id Asc Nulls First, customer.c_last Asc Nulls First, customer.c_first Asc Nulls First) ignore_prefix_len: 3)] |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

## Fetch latest order id via correlated MAX subquery
EXPLAIN SELECT o_id, o_entry_d, COALESCE(o_carrier_id,0) FROM orders WHERE o_w_id = 1 AND o_d_id = 1 AND o_c_id = 1001 AND o_id = (SELECT MAX(o_id) FROM orders WHERE o_w_id = 1 AND o_d_id = 1 AND o_c_id = 1001)
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| PLAN                                                                                                                                                                                                                                                                                                      |
+===========================================================================================================================================================================================================================================================================================================+
| Projection [orders.o_id, orders.o_entry_d, coalesce(orders.o_carrier_id, 0)] [Project => (Sort Option: Follow)]                                                                                                                                                                                           |
|   Inner Join On orders.o_id = Max(orders.o_id) [HashJoin => (Sort Option: None)]                                                                                                                                                                                                                          |
|     Filter (((cast (orders.o_w_id as Integer) = 1) && (cast (orders.o_d_id as Integer) = 1)) && (orders.o_c_id = 1001)), Is Having: false [Filter => (Sort Option: Follow)]                                                                                                                               |
|       TableScan orders -> [o_id, o_d_id, o_w_id, o_c_id, o_entry_d, o_carrier_id] [SeqScan => (Sort Option: None)]                                                                                                                                                                                        |
|     Projection [Max(orders.o_id)] [Project => (Sort Option: Follow)]                                                                                                                                                                                                                                      |
|       Aggregate [Max(orders.o_id)] [SimpleAggregate => (Sort Option: None)]                                                                                                                                                                                                                               |
|         Filter (((cast (orders.o_w_id as Integer) = 1) && (cast (orders.o_d_id as Integer) = 1)) && (orders.o_c_id = 1001)), Is Having: false [Filter => (Sort Option: Follow)]                                                                                                                           |
|           TableScan orders -> [o_id, o_d_id, o_w_id, o_c_id] [IndexScan By idx_orders => [(1, 1, 1001), (1, 1, 1001)] Covered => (Sort Option: OrderBy: (orders.o_w_id Asc Nulls First, orders.o_d_id Asc Nulls First, orders.o_c_id Asc Nulls First, orders.o_id Asc Nulls First) ignore_prefix_len: 3)] |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Code changes

  • Has Rust code change
  • Has CI related scripts change

Check List

Tests

  • Unit test
  • Integration test
  • Manual test (add detailed scripts or steps below)
  • No code

Side effects

  • Performance regression: Consumes more CPU
  • Performance regression: Consumes more Memory
  • Breaking backward compatibility

Note for reviewer

@KKould KKould merged commit 57a1a06 into main Jan 14, 2026
12 checks passed
KKould added a commit that referenced this pull request Jan 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants