| 101 | | |
| 102 | | |
| 103 | | QUERY PLAN | |
| 104 | | --------------------------------------------------------------------------------------------------------------------------------+ |
| 105 | | Nested Loop (cost=0.15..1418.59 rows=50 width=85) (actual time=0.052..5.758 rows=50 loops=1) | |
| 106 | | -> Seq Scan on portfolio_holdings ph (cost=0.00..1400.00 rows=50 width=26) (actual time=0.018..5.389 rows=50 loops=1) | |
| 107 | | Filter: ((quantity > 0) AND (portfolio_id = 1)) | |
| 108 | | Rows Removed by Filter: 59950 | |
| 109 | | -> Memoize (cost=0.15..0.49 rows=1 width=21) (actual time=0.003..0.003 rows=1 loops=50) | |
| 110 | | Cache Key: ph.stock_id | |
| 111 | | Cache Mode: logical | |
| 112 | | Hits: 0 Misses: 50 Evictions: 0 Overflows: 0 Memory Usage: 7kB | |
| 113 | | -> Index Scan using stock_pkey on stock s (cost=0.14..0.48 rows=1 width=21) (actual time=0.002..0.002 rows=1 loops=50)| |
| 114 | | Index Cond: (id = ph.stock_id) | |
| 115 | | Planning Time: 0.471 ms | |
| 116 | | Execution Time: 5.802 ms | |
| 117 | | |
| 118 | | }}} |
| 119 | | Користење: GROUP BY и JOIN по `portfolio_id` во CTE-ата `stock_weights` и `portfolio_totals` |
| 120 | | |
| 121 | | Подобрување: Index Scan наместо Seq Scan при групирање по портфолио |
| 122 | | |
| 123 | | --- |
| 124 | | |
| 125 | | **3. Add index on portfolio_id** |
| 126 | | {{{ |
| 127 | | CREATE INDEX idx_ph_portfolio_id ON portfolio_holdings(portfolio_id); |
| 128 | | ANALYZE portfolio_holdings; |
| 129 | | |
| 130 | | EXPLAIN ANALYZE |
| 131 | | SELECT |
| 132 | | ph.portfolio_id, |
| 133 | | ph.stock_id, |
| 134 | | s.symbol, |
| 135 | | ph.quantity::NUMERIC * s.current_price::NUMERIC AS market_value, |
| 136 | | ph.quantity::NUMERIC * (s.current_price::NUMERIC - ph.avg_price::NUMERIC) AS unrealized_pnl |
| 137 | | FROM portfolio_holdings ph |
| 138 | | JOIN stock s ON ph.stock_id = s.id |
| 139 | | WHERE quantity > 0 AND portfolio_id = 1; |
| 140 | | |
| 222 | | QUERY PLAN | |
| 223 | | ---------------------------------------------------------------------------------------------------------------------------------------+ |
| 224 | | Hash Join (cost=8.93..158.07 rows=50 width=85) (actual time=0.123..0.377 rows=50 loops=1) | |
| 225 | | Hash Cond: (ph.stock_id = s.id) | |
| 226 | | -> Bitmap Heap Scan on portfolio_holdings ph (cost=4.68..152.81 rows=50 width=26) (actual time=0.032..0.125 rows=50 loops=1) | |
| 227 | | Recheck Cond: ((portfolio_id = 1) AND (quantity > 0)) | |
| 228 | | Heap Blocks: exact=50 | |
| 229 | | -> Bitmap Index Scan on idx_ph_quantity_positive (cost=0.00..4.67 rows=50 width=0) (actual time=0.016..0.017 rows=50 loops=1)| |
| 230 | | Index Cond: (portfolio_id = 1) | |
| 231 | | -> Hash (cost=3.00..3.00 rows=100 width=21) (actual time=0.060..0.060 rows=100 loops=1) | |
| 232 | | Buckets: 1024 Batches: 1 Memory Usage: 14kB | |
| 233 | | -> Seq Scan on stock s (cost=0.00..3.00 rows=100 width=21) (actual time=0.018..0.037 rows=100 loops=1) | |
| 234 | | Planning Time: 0.299 ms | |
| 235 | | Execution Time: 0.416 ms | |
| 236 | | |
| 237 | | }}} |
| 238 | | |
| | 185 | |
| | 186 | |
| | 187 | }}} |
| | 188 | |
| | 189 | Овој индекс не влијае на перформансите на оваа анализа бидејќи табелата users не е дел од query-то. |