| 142 | | Обем на тест податоци: |
| 143 | | 500.000+ редови (Табела за нарачки), |
| 144 | | 100.000+ производи (Табела за производи) |
| 145 | | |
| 146 | | {{{ |
| 147 | | SET search_path TO stock_management; |
| 148 | | TRUNCATE purchase_order, product RESTART IDENTITY CASCADE; |
| 149 | | |
| 150 | | -- 100.000 производи |
| 151 | | INSERT INTO product (name, description, sku, unit_price, category_id, supplier_id) |
| 152 | | SELECT 'Product ' || i, 'Desc', 'SKU-' || i, (random() * 100)::numeric(12,2), 1, 1 FROM generate_series(1, 100000) AS i; |
| 153 | | |
| 154 | | -- 500.000 нарачки |
| 155 | | INSERT INTO purchase_order (order_date, expected_delivery_date, status, supplier_id, warehouse_id) |
| 156 | | SELECT CURRENT_DATE, CURRENT_DATE + i, CASE WHEN i % 2 = 0 THEN 'Pending' ELSE 'Received' END, 1, 1 FROM generate_series(1, 500000) AS i; |
| 157 | | }}} |
| 158 | | |
| 159 | | === Сценарио 1: Листaње на нарачки во очекување === |
| 160 | | |
| 161 | | Цел: Персоналот во магацинот да ги гледа само нарачките чиј статус е '''Pending''' (Во очекување). Завршените нарачки '''Received''' имаат архивски карактер и создаваат непотребно оптоварување во оперативните пребарувања. |
| 162 | | |
| 163 | | {{{ |
| 164 | | SELECT * FROM purchase_order WHERE status = 'Pending'; |
| 165 | | EXPLAIN ANALYZE SELECT * FROM purchase_order WHERE status = 'Pending'; |
| | 142 | === Сценарио 1: Тековен залиха по складиште === |
| | 143 | |
| | 144 | Цел: Прикажува вкупниот број производи и вредност на залихата по складишта. |
| | 145 | |
| | 146 | {{{ |
| | 147 | SELECT |
| | 148 | w.warehouse_id, |
| | 149 | w.name AS warehouse_name, |
| | 150 | SUM(ws.quantity_on_hand) AS total_units, |
| | 151 | SUM(ws.quantity_on_hand * p.unit_price) AS total_stock_value |
| | 152 | FROM warehouse_stock ws |
| | 153 | JOIN warehouse w ON ws.warehouse_id = w.warehouse_id |
| | 154 | JOIN product p ON ws.product_id = p.product_id |
| | 155 | GROUP BY w.warehouse_id, w.name |
| | 156 | ORDER BY total_stock_value DESC; |
| | 160 | |
| | 161 | Кога се поврзува табелата **warehouse_stock** со табелата **product** преку колоната **product_id** (JOIN), ако нема индекс, базата на податоци ќе ги скенира сите редови. |
| | 162 | |
| | 163 | {{{ |
| | 164 | "HashAggregate (cost=705.70..706.95 rows=100 width=262) (actual time=102.460..102.484 rows=3.00 loops=1)" |
| | 165 | " Group Key: w.warehouse_id" |
| | 166 | " Batches: 1 Memory Usage: 32kB" |
| | 167 | " Buffers: shared hit=164 dirtied=1" |
| | 168 | " -> Hash Join (cost=191.75..518.20 rows=15000 width=232) (actual time=4.965..78.081 rows=15000.00 loops=1)" |
| | 169 | " Hash Cond: (ws.product_id = p.product_id)" |
| | 170 | " Buffers: shared hit=164 dirtied=1" |
| | 171 | " -> Hash Join (cost=12.25..299.29 rows=15000 width=230) (actual time=0.282..37.808 rows=15000.00 loops=1)" |
| | 172 | " Hash Cond: (ws.warehouse_id = w.warehouse_id)" |
| | 173 | " Buffers: shared hit=97 dirtied=1" |
| | 174 | " -> Seq Scan on warehouse_stock ws (cost=0.00..246.00 rows=15000 width=12) (actual time=0.103..20.064 rows=15000.00 loops=1)" |
| | 175 | " Buffers: shared hit=96" |
| | 176 | " -> Hash (cost=11.00..11.00 rows=100 width=222) (actual time=0.068..0.069 rows=3.00 loops=1)" |
| | 177 | " Buckets: 1024 Batches: 1 Memory Usage: 9kB" |
| | 178 | " Buffers: shared hit=1 dirtied=1" |
| | 179 | " -> Seq Scan on warehouse w (cost=0.00..11.00 rows=100 width=222) (actual time=0.029..0.032 rows=3.00 loops=1)" |
| | 180 | " Buffers: shared hit=1 dirtied=1" |
| | 181 | " -> Hash (cost=117.00..117.00 rows=5000 width=10) (actual time=4.433..4.444 rows=5000.00 loops=1)" |
| | 182 | " Buckets: 8192 Batches: 1 Memory Usage: 279kB" |
| | 183 | " Buffers: shared hit=67" |
| | 184 | " -> Seq Scan on product p (cost=0.00..117.00 rows=5000 width=10) (actual time=0.044..1.930 rows=5000.00 loops=1)" |
| | 185 | " Buffers: shared hit=67" |
| | 186 | "Planning:" |
| | 187 | " Buffers: shared hit=86" |
| | 188 | "Planning Time: 26.724 ms" |
| | 189 | "Execution Time: 103.080 ms" |
| | 190 | }}} |