RWM Console cluster: risingwave-adib.adib-rw.svc.cluster.local

← cluster adib_rm objects cash_holds_mv explain
Overview Objects Graph History
materialized view · adib_rm.cash_holds_mv profiled over 5s
seconds (1–30)

Job is idle — throughput ~0; structure shown.

Stateful hash join (4 state tables) — consider a temporal join for dimension lookups
29 operators
Materialize · adib_rm.cash_holds_mv
0% idle 2 actors
Merge
2 actors
Exchange
0% idle 0 actors
SyncLogStore · LeftOuter · order_cash_holds.order_id = order_settlements.order_id
2 actors
HashJoin · LeftOuter · order_cash_holds.order_id = order_settlements.order_id Stateful hash join (4 state tables) — consider a temporal join for dimension lookups
0% idle 2 actors
Project · LeftOuter · order_cash_holds.order_id = order_settlements.order_id
2 actors
GroupTopN · LeftOuter · order_cash_holds.order_id = order_settlements.order_id
1% idle 2 actors
Merge
2 actors
Exchange
0% idle 0 actors
Filter · order_settlements
0% idle 2 actors
StreamScan · order_settlements
0% idle 2 actors
BatchPlan
2 actors
Merge
2 actors
Merge
2 actors
Exchange
0% idle 0 actors
SyncLogStore · LeftOuter · order_cash_holds.order_id = orders.id
2 actors
HashJoin · LeftOuter · order_cash_holds.order_id = orders.id Stateful hash join (4 state tables) — consider a temporal join for dimension lookups
0% idle 2 actors
Merge
2 actors
Exchange
0% idle 0 actors
Project · orders
2 actors
GroupTopN · orders
0% idle 2 actors
StreamScan · orders
0% idle 2 actors
BatchPlan
2 actors
Merge
2 actors
Merge
2 actors
Exchange
0% idle 0 actors
StreamScan · order_cash_holds
0% idle 2 actors
BatchPlan
2 actors
Merge
2 actors
Heat = the operator's output-buffer backpressure over the sampling window. Click a node to fold its subtree.
Materialize · adib_rm.cash_holds_mv Materialize adib_rm.cash_holds_mv idle · 2 actors Merge Merge — · 2 actors Exchange Exchange idle · 0 actors SyncLogStore · LeftOuter · order_cash_holds.order_id = order_settlements.order_id SyncLogStore LeftOuter · order_cash_… — · 2 actors HashJoin · LeftOuter · order_cash_holds.order_id = order_settlements.order_id HashJoin LeftOuter · order_cash_… idle · 2 actors Project · LeftOuter · order_cash_holds.order_id = order_settlements.order_id Project LeftOuter · order_cash_… — · 2 actors GroupTopN · LeftOuter · order_cash_holds.order_id = order_settlements.order_id GroupTopN LeftOuter · order_cash_… idle · 2 actors Merge Merge — · 2 actors Exchange Exchange idle · 0 actors Filter · order_settlements Filter order_settlements idle · 2 actors StreamScan · order_settlements StreamScan order_settlements idle · 2 actors BatchPlan BatchPlan — · 2 actors Merge Merge — · 2 actors Merge Merge — · 2 actors Exchange Exchange idle · 0 actors SyncLogStore · LeftOuter · order_cash_holds.order_id = orders.id SyncLogStore LeftOuter · order_cash_… — · 2 actors HashJoin · LeftOuter · order_cash_holds.order_id = orders.id HashJoin LeftOuter · order_cash_… idle · 2 actors Merge Merge — · 2 actors Exchange Exchange idle · 0 actors Project · orders Project orders — · 2 actors GroupTopN · orders GroupTopN orders idle · 2 actors StreamScan · orders StreamScan orders idle · 2 actors BatchPlan BatchPlan — · 2 actors Merge Merge — · 2 actors Merge Merge — · 2 actors Exchange Exchange idle · 0 actors StreamScan · order_cash_holds StreamScan order_cash_holds idle · 2 actors BatchPlan BatchPlan — · 2 actors Merge Merge — · 2 actors
Streaming operator plan from EXPLAIN ANALYZE. Node heat = backpressure. Drag to pan, scroll to zoom.
Fragments (DESCRIBE FRAGMENTS) — click to expand
Fragment 25032 (Actor 120012,120011)
StreamMaterialize { columns: [cash_hold_id, order_id, provider_hold_id, funding_account_id, hold_amount, float_used, currency_code, status, created_at, updated_at, order_execution_state, order_executed_at, settlement_id, settlement_state, settlement_expected_date, settlement_settled_at, order_settlements.order_id(hidden)], stream_key: [cash_hold_id, order_id], pk_columns: [cash_hold_id, order_id], pk_conflict: NoCheck }
├── output:
│   ┌── order_cash_holds.id
│   ├── order_cash_holds.order_id
│   ├── order_cash_holds.provider_hold_id
│   ├── order_cash_holds.funding_account_id
│   ├── order_cash_holds.hold_amount
│   ├── order_cash_holds.float_used
│   ├── order_cash_holds.currency_code
│   ├── order_cash_holds.status
│   ├── order_cash_holds.created_at
│   ├── order_cash_holds.updated_at
│   ├── orders.execution_state
│   ├── orders.executed_at
│   ├── order_settlements.id
│   ├── order_settlements.state
│   ├── order_settlements.expected_settlement_date
│   ├── order_settlements.settled_at
│   └── order_settlements.order_id
├── stream key: [ order_cash_holds.id, order_cash_holds.order_id ]
└── MergeExecutor
    ├── output:
    │   ┌── order_cash_holds.id
    │   ├── order_cash_holds.order_id
    │   ├── order_cash_holds.provider_hold_id
    │   ├── order_cash_holds.funding_account_id
    │   ├── order_cash_holds.hold_amount
    │   ├── order_cash_holds.float_used
    │   ├── order_cash_holds.currency_code
    │   ├── order_cash_holds.status
    │   ├── order_cash_holds.created_at
    │   ├── order_cash_holds.updated_at
    │   ├── orders.execution_state
    │   ├── orders.executed_at
    │   ├── order_settlements.id
    │   ├── order_settlements.state
    │   ├── order_settlements.expected_settlement_date
    │   ├── order_settlements.settled_at
    │   └── order_settlements.order_id
    └── stream key: [ order_cash_holds.id, order_cash_holds.order_id ]

Fragment 25033 (Actor 120007,120008)
StreamSyncLogStore
├── output:
│   ┌── order_cash_holds.id
│   ├── order_cash_holds.order_id
│   ├── order_cash_holds.provider_hold_id
│   ├── order_cash_holds.funding_account_id
│   ├── order_cash_holds.hold_amount
│   ├── order_cash_holds.float_used
│   ├── order_cash_holds.currency_code
│   ├── order_cash_holds.status
│   ├── order_cash_holds.created_at
│   ├── order_cash_holds.updated_at
│   ├── orders.execution_state
│   ├── orders.executed_at
│   ├── order_settlements.id
│   ├── order_settlements.state
│   ├── order_settlements.expected_settlement_date
│   ├── order_settlements.settled_at
│   └── order_settlements.order_id
├── stream key: [ order_cash_holds.id, order_cash_holds.order_id ]
└── StreamHashJoin { type: LeftOuter, predicate: order_cash_holds.order_id = order_settlements.order_id }
    ├── output:
    │   ┌── order_cash_holds.id
    │   ├── order_cash_holds.order_id
    │   ├── order_cash_holds.provider_hold_id
    │   ├── order_cash_holds.funding_account_id
    │   ├── order_cash_holds.hold_amount
    │   ├── order_cash_holds.float_used
    │   ├── order_cash_holds.currency_code
    │   ├── order_cash_holds.status
    │   ├── order_cash_holds.created_at
    │   ├── order_cash_holds.updated_at
    │   ├── orders.execution_state
    │   ├── orders.executed_at
    │   ├── order_settlements.id
    │   ├── order_settlements.state
    │   ├── order_settlements.expected_settlement_date
    │   ├── order_settlements.settled_at
    │   └── order_settlements.order_id
    ├── stream key: [ order_cash_holds.id, order_cash_holds.order_id ]
    ├── MergeExecutor
    │   ├── output: [ order_cash_holds.id, order_cash_holds.order_id, order_cash_holds.provider_hold_id, order_cash_holds.funding_account_id, order_cash_holds.hold_amount, order_cash_holds.float_used, order_cash_holds.currency_code, order_cash_holds.status, order_cash_holds.created_at, order_cash_holds.updated_at, orders.execution_state, orders.executed_at, orders.id ]
    │   └── stream key: [ order_cash_holds.id, order_cash_holds.order_id ]
    └── StreamProject { exprs: [order_settlements.order_id, order_settlements.id, order_settlements.state, order_settlements.expected_settlement_date, order_settlements.settled_at] } { output: [ order_settlements.order_id, order_settlements.id, order_settlements.state, order_settlements.expected_settlement_date, order_settlements.settled_at ], stream key: [ order_settlements.order_id ] }
        └── StreamGroupTopN { order: [order_settlements.settled_at DESC NULLS LAST, order_settlements.created_at DESC, order_settlements.id DESC], limit: 1, offset: 0, group_key: [order_settlements.order_id] }
            ├── output: [ order_settlements.id, order_settlements.order_id, order_settlements.state, order_settlements.expected_settlement_date, order_settlements.settled_at, order_settlements.created_at ]
            ├── stream key: [ order_settlements.order_id ]
            └── MergeExecutor { output: [ order_settlements.id, order_settlements.order_id, order_settlements.state, order_settlements.expected_settlement_date, order_settlements.settled_at, order_settlements.created_at ], stream key: [ order_settlements.id ] }

Fragment 25034 (Actor 120009,120010)
StreamSyncLogStore
├── output: [ order_cash_holds.id, order_cash_holds.order_id, order_cash_holds.provider_hold_id, order_cash_holds.funding_account_id, order_cash_holds.hold_amount, order_cash_holds.float_used, order_cash_holds.currency_code, order_cash_holds.status, order_cash_holds.created_at, order_cash_holds.updated_at, orders.execution_state, orders.executed_at, orders.id ]
├── stream key: [ order_cash_holds.id, order_cash_holds.order_id ]
└── StreamHashJoin { type: LeftOuter, predicate: order_cash_holds.order_id = orders.id }
    ├── output: [ order_cash_holds.id, order_cash_holds.order_id, order_cash_holds.provider_hold_id, order_cash_holds.funding_account_id, order_cash_holds.hold_amount, order_cash_holds.float_used, order_cash_holds.currency_code, order_cash_holds.status, order_cash_holds.created_at, order_cash_holds.updated_at, orders.execution_state, orders.executed_at, orders.id ]
    ├── stream key: [ order_cash_holds.id, order_cash_holds.order_id ]
    ├── MergeExecutor { output: [ order_cash_holds.id, order_cash_holds.order_id, order_cash_holds.provider_hold_id, order_cash_holds.funding_account_id, order_cash_holds.hold_amount, order_cash_holds.float_used, order_cash_holds.currency_code, order_cash_holds.status, order_cash_holds.created_at, order_cash_holds.updated_at ], stream key: [ order_cash_holds.id ] }
    └── MergeExecutor { output: [ orders.id, orders.execution_state, orders.executed_at ], stream key: [ orders.id ] }

Fragment 25035 (Actor 120013,120014)
StreamTableScan { table: order_cash_holds, columns: [id, order_id, provider_hold_id, funding_account_id, hold_amount, float_used, currency_code, status, created_at, updated_at] }
├── output: [ order_cash_holds.id, order_cash_holds.order_id, order_cash_holds.provider_hold_id, order_cash_holds.funding_account_id, order_cash_holds.hold_amount, order_cash_holds.float_used, order_cash_holds.currency_code, order_cash_holds.status, order_cash_holds.created_at, order_cash_holds.updated_at ]
├── stream key: [ order_cash_holds.id ]
├── Upstream { output: [ id, order_id, provider_hold_id, funding_account_id, hold_amount, float_used, currency_code, status, created_at, updated_at ], stream key: [] }
└── BatchPlanNode { output: [ id, order_id, provider_hold_id, funding_account_id, hold_amount, float_used, currency_code, status, created_at, updated_at ], stream key: [] }

Fragment 25036 (Actor 120015,120016)
StreamProject { exprs: [orders.id, orders.execution_state, orders.executed_at] } { output: [ orders.id, orders.execution_state, orders.executed_at ], stream key: [ orders.id ] }
└── StreamGroupTopN { order: [orders.created_at DESC], limit: 1, offset: 0, group_key: [orders.id] } { output: [ orders.id, orders.execution_state, orders.created_at, orders.executed_at ], stream key: [ orders.id ] }
    └── StreamTableScan { table: orders, columns: [id, execution_state, created_at, executed_at] } { output: [ orders.id, orders.execution_state, orders.created_at, orders.executed_at ], stream key: [ orders.id, orders.created_at ] }
        ├── Upstream { output: [ id, execution_state, created_at, executed_at ], stream key: [] }
        └── BatchPlanNode { output: [ id, execution_state, created_at, executed_at ], stream key: [] }

Fragment 25037 (Actor 120018,120017)
StreamFilter { predicate: Not(IsNull(order_settlements.order_id)) } { output: [ order_settlements.id, order_settlements.order_id, order_settlements.state, order_settlements.expected_settlement_date, order_settlements.settled_at, order_settlements.created_at ], stream key: [ order_settlements.id ] }
└── StreamTableScan { table: order_settlements, columns: [id, order_id, state, expected_settlement_date, settled_at, created_at] } { output: [ order_settlements.id, order_settlements.order_id, order_settlements.state, order_settlements.expected_settlement_date, order_settlements.settled_at, order_settlements.created_at ], stream key: [ order_settlements.id ] }
    ├── Upstream { output: [ id, order_id, state, expected_settlement_date, settled_at, created_at ], stream key: [] }
    └── BatchPlanNode { output: [ id, order_id, state, expected_settlement_date, settled_at, created_at ], stream key: [] }