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

← cluster insights objects private_asset_valuations_mv explain
Overview Objects Graph History
materialized view · insights.private_asset_valuations_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
46 operators
Materialize · insights.private_asset_valuations_mv
0% idle 2 actors
Project · ((Not(IsNull(fx_rates_snapshot_mv_next.rate)) OR (Coalesce(…
2 actors
Filter · ((Not(IsNull(fx_rates_snapshot_mv_next.rate)) OR (Coalesce(…
0% idle 2 actors
Merge
2 actors
Exchange
0% idle 0 actors
SyncLogStore · LeftOuter · $expr1 = fx_rates_snapshot_mv_next.source_currency_code
2 actors
HashJoin · LeftOuter · $expr1 = fx_rates_snapshot_mv_next.source_currency_code 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
LocalityProvider
0% idle 2 actors
Merge
2 actors
Exchange
0% idle 0 actors
Filter · fx_rates_snapshot_mv_next
0% idle 2 actors
StreamScan · fx_rates_snapshot_mv_next
0% idle 2 actors
BatchPlan
2 actors
Merge
2 actors
Merge
2 actors
Exchange
0% idle 0 actors
LocalityProvider
0% idle 2 actors
Merge
2 actors
Exchange
0% idle 0 actors
Project · (Not(IsNull(fx_rates_snapshot_mv_next.rate)) OR (private_as…
2 actors
Filter · (Not(IsNull(fx_rates_snapshot_mv_next.rate)) OR (private_as…
0% idle 2 actors
Merge
2 actors
Exchange
0% idle 0 actors
SyncLogStore · LeftOuter · private_asset_valuations_ft.market_value_currency = fx_rate…
2 actors
HashJoin · LeftOuter · private_asset_valuations_ft.market_value_currency = fx_rate… 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
LocalityProvider
0% idle 2 actors
Merge
2 actors
Exchange
0% idle 0 actors
Filter · fx_rates_snapshot_mv_next
0% idle 2 actors
StreamScan · fx_rates_snapshot_mv_next
0% idle 2 actors
BatchPlan
2 actors
Merge
2 actors
Merge
2 actors
Exchange
0% idle 0 actors
LocalityProvider
0% idle 2 actors
Merge
2 actors
Exchange
0% idle 0 actors
Project · private_asset_valuations_ft
2 actors
Filter · private_asset_valuations_ft
0% idle 2 actors
StreamScan · private_asset_valuations_ft
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 · insights.private_asset_valuations_mv Materialize insights.private_asset_… idle · 2 actors Project · ((Not(IsNull(fx_rates_snapshot_mv_next.rate)) OR (Coalesce(… Project ((Not(IsNull(fx_rates_s… — · 2 actors Filter · ((Not(IsNull(fx_rates_snapshot_mv_next.rate)) OR (Coalesce(… Filter ((Not(IsNull(fx_rates_s… idle · 2 actors Merge Merge — · 2 actors Exchange Exchange idle · 0 actors SyncLogStore · LeftOuter · $expr1 = fx_rates_snapshot_mv_next.source_currency_code SyncLogStore LeftOuter · $expr1 = fx… — · 2 actors HashJoin · LeftOuter · $expr1 = fx_rates_snapshot_mv_next.source_currency_code HashJoin LeftOuter · $expr1 = fx… idle · 2 actors Merge Merge — · 2 actors Exchange Exchange idle · 0 actors LocalityProvider LocalityProvider idle · 2 actors Merge Merge — · 2 actors Exchange Exchange idle · 0 actors Filter · fx_rates_snapshot_mv_next Filter fx_rates_snapshot_mv_ne… idle · 2 actors StreamScan · fx_rates_snapshot_mv_next StreamScan fx_rates_snapshot_mv_ne… idle · 2 actors BatchPlan BatchPlan — · 2 actors Merge Merge — · 2 actors Merge Merge — · 2 actors Exchange Exchange idle · 0 actors LocalityProvider LocalityProvider idle · 2 actors Merge Merge — · 2 actors Exchange Exchange idle · 0 actors Project · (Not(IsNull(fx_rates_snapshot_mv_next.rate)) OR (private_as… Project (Not(IsNull(fx_rates_sn… — · 2 actors Filter · (Not(IsNull(fx_rates_snapshot_mv_next.rate)) OR (private_as… Filter (Not(IsNull(fx_rates_sn… idle · 2 actors Merge Merge — · 2 actors Exchange Exchange idle · 0 actors SyncLogStore · LeftOuter · private_asset_valuations_ft.market_value_currency = fx_rate… SyncLogStore LeftOuter · private_ass… — · 2 actors HashJoin · LeftOuter · private_asset_valuations_ft.market_value_currency = fx_rate… HashJoin LeftOuter · private_ass… idle · 2 actors Merge Merge — · 2 actors Exchange Exchange idle · 0 actors LocalityProvider LocalityProvider idle · 2 actors Merge Merge — · 2 actors Exchange Exchange idle · 0 actors Filter · fx_rates_snapshot_mv_next Filter fx_rates_snapshot_mv_ne… idle · 2 actors StreamScan · fx_rates_snapshot_mv_next StreamScan fx_rates_snapshot_mv_ne… idle · 2 actors BatchPlan BatchPlan — · 2 actors Merge Merge — · 2 actors Merge Merge — · 2 actors Exchange Exchange idle · 0 actors LocalityProvider LocalityProvider idle · 2 actors Merge Merge — · 2 actors Exchange Exchange idle · 0 actors Project · private_asset_valuations_ft Project private_asset_valuation… — · 2 actors Filter · private_asset_valuations_ft Filter private_asset_valuation… idle · 2 actors StreamScan · private_asset_valuations_ft StreamScan private_asset_valuation… 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 58833 (Actor 739409,739410)
StreamMaterialize { columns: [asset_id, fact_date, market_value_currency, value_system_currency, cost_system_currency, $expr1(hidden), private_asset_valuations_ft.id(hidden), fx_rates_snapshot_mv_next.target_currency_code(hidden), fx_rates_snapshot_mv_next.target_currency_code#1(hidden)], stream_key: [$expr1, market_value_currency, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code, fx_rates_snapshot_mv_next.target_currency_code#1], pk_columns: [$expr1, market_value_currency, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code, fx_rates_snapshot_mv_next.target_currency_code#1], pk_conflict: NoCheck }
├── output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value_currency, $expr2, $expr3, $expr1, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code, fx_rates_snapshot_mv_next.target_currency_code ]
├── stream key: [ $expr1, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code, fx_rates_snapshot_mv_next.target_currency_code ]
└── StreamProject { exprs: [private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value_currency, (private_asset_valuations_ft.market_value * Coalesce(fx_rates_snapshot_mv_next.rate, Case((private_asset_valuations_ft.market_value_currency = 'SAR':Varchar), 1:Int32, null:Int32)::Decimal)) as $expr2, Case((Coalesce(private_asset_valuations_ft.average_cost, 0:Decimal) = 0:Decimal), 0:Decimal, (private_asset_valuations_ft.average_cost * Coalesce(fx_rates_snapshot_mv_next.rate, Case((Coalesce(private_asset_valuations_ft.average_cost_currency, private_asset_valuations_ft.market_value_currency) = 'SAR':Varchar), 1:Int32, null:Int32)::Decimal))) as $expr3, $expr1, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code, fx_rates_snapshot_mv_next.target_currency_code] }
    ├── output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value_currency, $expr2, $expr3, $expr1, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code, fx_rates_snapshot_mv_next.target_currency_code ]
    ├── stream key: [ $expr1, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code, fx_rates_snapshot_mv_next.target_currency_code ]
    └── StreamFilter { predicate: ((Not(IsNull(fx_rates_snapshot_mv_next.rate)) OR (Coalesce(private_asset_valuations_ft.average_cost_currency, private_asset_valuations_ft.market_value_currency) = 'SAR':Varchar)) OR (Coalesce(private_asset_valuations_ft.average_cost, 0:Decimal) = 0:Decimal)) }
        ├── output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, fx_rates_snapshot_mv_next.rate, fx_rates_snapshot_mv_next.rate, $expr1, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code, fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ]
        ├── stream key: [ $expr1, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code, fx_rates_snapshot_mv_next.target_currency_code ]
        └── MergeExecutor { output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, fx_rates_snapshot_mv_next.rate, fx_rates_snapshot_mv_next.rate, $expr1, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code, fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ $expr1, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code, fx_rates_snapshot_mv_next.target_currency_code ] }

Fragment 58834 (Actor 739411,739412)
StreamSyncLogStore { output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, fx_rates_snapshot_mv_next.rate, fx_rates_snapshot_mv_next.rate, $expr1, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code, fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ $expr1, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code, fx_rates_snapshot_mv_next.target_currency_code ] }
└── StreamHashJoin { type: LeftOuter, predicate: $expr1 = fx_rates_snapshot_mv_next.source_currency_code } { output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, fx_rates_snapshot_mv_next.rate, fx_rates_snapshot_mv_next.rate, $expr1, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code, fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ $expr1, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code, fx_rates_snapshot_mv_next.target_currency_code ] }
    ├── MergeExecutor { output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, fx_rates_snapshot_mv_next.rate, $expr1, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ $expr1, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code ] }
    └── MergeExecutor { output: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.rate, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ] }

Fragment 58835 (Actor 739415,739416)
StreamLocalityProvider { locality_columns: [$expr1] } { output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, fx_rates_snapshot_mv_next.rate, $expr1, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ $expr1, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code ] }
└── MergeExecutor { output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, fx_rates_snapshot_mv_next.rate, $expr1, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code ] }

Fragment 58836 (Actor 739424,739423)
StreamProject { exprs: [private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, fx_rates_snapshot_mv_next.rate, Coalesce(private_asset_valuations_ft.average_cost_currency, private_asset_valuations_ft.market_value_currency) as $expr1, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code] }
├── output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, fx_rates_snapshot_mv_next.rate, $expr1, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code ]
├── stream key: [ private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code ]
└── StreamFilter { predicate: (Not(IsNull(fx_rates_snapshot_mv_next.rate)) OR (private_asset_valuations_ft.market_value_currency = 'SAR':Varchar)) } { output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, fx_rates_snapshot_mv_next.rate, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code ] }
    └── MergeExecutor { output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, fx_rates_snapshot_mv_next.rate, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code ] }

Fragment 58837 (Actor 739422,739421)
StreamSyncLogStore { output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, fx_rates_snapshot_mv_next.rate, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code ] }
└── StreamHashJoin { type: LeftOuter, predicate: private_asset_valuations_ft.market_value_currency = fx_rates_snapshot_mv_next.source_currency_code } { output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, fx_rates_snapshot_mv_next.rate, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.id, fx_rates_snapshot_mv_next.target_currency_code ] }
    ├── MergeExecutor { output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, private_asset_valuations_ft.id ], stream key: [ private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.id ] }
    └── MergeExecutor { output: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.rate, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ] }

Fragment 58838 (Actor 739439,739440)
StreamLocalityProvider { locality_columns: [private_asset_valuations_ft.market_value_currency] } { output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, private_asset_valuations_ft.id ], stream key: [ private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.id ] }
└── MergeExecutor { output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, private_asset_valuations_ft.id ], stream key: [ private_asset_valuations_ft.id ] }

Fragment 58839 (Actor 739461,739462)
StreamProject { exprs: [private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, private_asset_valuations_ft.id] } { output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, private_asset_valuations_ft.id ], stream key: [ private_asset_valuations_ft.id ] }
└── StreamFilter { predicate: IsNull(private_asset_valuations_ft.disabled_at) } { output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, private_asset_valuations_ft.id, private_asset_valuations_ft.disabled_at ], stream key: [ private_asset_valuations_ft.id ] }
    └── StreamTableScan { table: private_asset_valuations_ft, columns: [asset_id, fact_date, market_value, market_value_currency, average_cost, average_cost_currency, id, disabled_at] } { output: [ private_asset_valuations_ft.asset_id, private_asset_valuations_ft.fact_date, private_asset_valuations_ft.market_value, private_asset_valuations_ft.market_value_currency, private_asset_valuations_ft.average_cost, private_asset_valuations_ft.average_cost_currency, private_asset_valuations_ft.id, private_asset_valuations_ft.disabled_at ], stream key: [ private_asset_valuations_ft.id ] }
        ├── Upstream { output: [ asset_id, fact_date, market_value, market_value_currency, average_cost, average_cost_currency, id, disabled_at ], stream key: [] }
        └── BatchPlanNode { output: [ asset_id, fact_date, market_value, market_value_currency, average_cost, average_cost_currency, id, disabled_at ], stream key: [] }

Fragment 58840 (Actor 739466,739465)
StreamLocalityProvider { locality_columns: [fx_rates_snapshot_mv_next.source_currency_code] } { output: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.rate, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ] }
└── MergeExecutor { output: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.rate, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ] }

Fragment 58841 (Actor 739520,739519)
StreamFilter { predicate: (fx_rates_snapshot_mv_next.target_currency_code = 'SAR':Varchar) } { output: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.rate, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ] }
└── StreamTableScan { table: fx_rates_snapshot_mv_next, columns: [source_currency_code, rate, target_currency_code] } { output: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.rate, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ] }
    ├── Upstream { output: [ source_currency_code, rate, target_currency_code ], stream key: [] }
    └── BatchPlanNode { output: [ source_currency_code, rate, target_currency_code ], stream key: [] }

Fragment 58842 (Actor 739502,739501)
StreamLocalityProvider { locality_columns: [fx_rates_snapshot_mv_next.source_currency_code] } { output: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.rate, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ] }
└── MergeExecutor { output: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.rate, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ] }

Fragment 58843 (Actor 739522,739521)
StreamFilter { predicate: (fx_rates_snapshot_mv_next.target_currency_code = 'SAR':Varchar) } { output: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.rate, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ] }
└── StreamTableScan { table: fx_rates_snapshot_mv_next, columns: [source_currency_code, rate, target_currency_code] } { output: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.rate, fx_rates_snapshot_mv_next.target_currency_code ], stream key: [ fx_rates_snapshot_mv_next.source_currency_code, fx_rates_snapshot_mv_next.target_currency_code ] }
    ├── Upstream { output: [ source_currency_code, rate, target_currency_code ], stream key: [] }
    └── BatchPlanNode { output: [ source_currency_code, rate, target_currency_code ], stream key: [] }