explain.depesz.com

PostgreSQL's explain analyze made readable

Result: UPW7

Settings
# exclusive inclusive rows x rows loops node
1. 0.000 0.000 ↓ 0.0

Sort (cost=2,236,949,882.85..2,236,949,964.70 rows=32,740 width=462) (actual rows= loops=)

  • Output: s.appl_id, p.venue_symbol, p.venue_symbol, 'FUTURE', 'SPREAD', s.*, s.asset, s.last_eligible_trade_date
  • Sort Key: s.*, s.asset, s.last_eligible_trade_date
2. 0.000 0.000 ↓ 0.0

Nested Loop (cost=0.42..2,236,943,428.00 rows=32,740 width=462) (actual rows= loops=)

  • Output: s.appl_id, p.venue_symbol, p.venue_symbol, 'FUTURE', 'SPREAD', s.*, s.asset, s.last_eligible_trade_date
3. 0.000 0.000 ↓ 0.0

Seq Scan on product.market p (cost=0.00..1,590.80 rows=65,480 width=11) (actual rows= loops=)

  • Output: p.product_id, p.exchange_mic, p.market_mic, p.cfi_code, p.isin, p.cusip, p.venue_asset, p.venue_symbol, p.product_type, p.product_sub_type, p.first_trade_date, p.last_trade_date, p.expiration_date, p.front_leg_contract_date, p.back_leg_contract_date, p.strike_price, p.call_put, p.underlying_name, p._ctime, p._cuser, p._mtime, p._muser, p._active, p._description, p._notes, p._tracking
4. 0.000 0.000 ↓ 0.0

Index Scan using secdef_dat_symbol_idx on cme.secdef_dat s (cost=0.42..34,162.20 rows=1 width=387) (actual rows= loops=)

  • Output: s.appl_id, s.*, s.asset, s.last_eligible_trade_date, s.symbol
  • Index Cond: ((s.symbol)::text = (p.venue_symbol)::text)
  • Filter: (SubPlan 1)
5.          

SubPlan (for Index Scan)

6. 0.000 0.000 ↓ 0.0

Sort (cost=34,148.33..34,161.38 rows=5,220 width=51) (actual rows= loops=)

  • Output: ranks.symbol, (s.asset), ranks.nth_item
  • Sort Key: ranks.nth_item
7. 0.000 0.000 ↓ 0.0

Subquery Scan on ranks (cost=33,238.71..33,826.00 rows=5,220 width=51) (actual rows= loops=)

  • Output: ranks.symbol, s.asset, ranks.nth_item
  • Filter: (ranks.nth_item < 8)
8. 0.000 0.000 ↓ 0.0

WindowAgg (cost=33,238.71..33,630.24 rows=15,661 width=50) (actual rows= loops=)

  • Output: s_1.asset, s_1.symbol, row_number() OVER (?), s1.last_eligible_trade_date, s_1.security_type, s_1.security_sub_type
9. 0.000 0.000 ↓ 0.0

Sort (cost=33,238.71..33,277.87 rows=15,661 width=42) (actual rows= loops=)

  • Output: s_1.asset, s1.last_eligible_trade_date, s_1.security_type, s_1.security_sub_type, s_1.symbol
  • Sort Key: s_1.asset, s1.last_eligible_trade_date
10. 0.000 0.000 ↓ 0.0

Gather (cost=1,000.43..32,147.54 rows=15,661 width=42) (actual rows= loops=)

  • Output: s_1.asset, s1.last_eligible_trade_date, s_1.security_type, s_1.security_sub_type, s_1.symbol
  • Workers Planned: 3
11. 0.000 0.000 ↓ 0.0

Nested Loop Left Join (cost=0.43..29,581.44 rows=5,052 width=42) (actual rows= loops=)

  • Output: s_1.asset, s1.last_eligible_trade_date, s_1.security_type, s_1.security_sub_type, s_1.symbol
12. 0.000 0.000 ↓ 0.0

Parallel Seq Scan on cme.secdef_dat s_1 (cost=0.00..22,274.17 rows=5,052 width=21) (actual rows= loops=)

  • Output: s_1.asset, s_1.cfi_code, s_1.last_update_time, s_1.activation_date, s_1.last_eligible_trade_date, s_1.market_segment_id, s_1.maturity_month_year, s_1.security_desc, s_1.security_exchange, s_1.security_group, s_1.appl_id, s_1.security_id, s_1.security_id_source, s_1.security_sub_type, s_1.security_type, s_1.symbol, s_1.underlying_product, s_1._ctime, s_1._cuser, s_1._mtime, s_1._muser, s_1._active, s_1._description, s_1._notes, s_1._tracking
  • Filter: (((s_1.security_type)::text = 'FUT'::text) AND ((s_1.security_sub_type)::text = 'SP'::text))
13. 0.000 0.000 ↓ 0.0

Index Scan using secdef_dat_symbol_idx on cme.secdef_dat s1 (cost=0.43..1.44 rows=1 width=32) (actual rows= loops=)

  • Output: s1.asset, s1.cfi_code, s1.last_update_time, s1.activation_date, s1.last_eligible_trade_date, s1.market_segment_id, s1.maturity_month_year, s1.security_desc, s1.security_exchange, s1.security_group, s1.appl_id, s1.security_id, s1.security_id_source, s1.security_sub_type, s1.security_type, s1.symbol, s1.underlying_product, s1._ctime, s1._cuser, s1._mtime, s1._muser, s1._active, s1._description, s1._notes, s1._tracking
  • Index Cond: ((s1.symbol)::text = split_part((s_1.symbol)::text, '-'::text, 2))