Changes between Version 17 and Version 18 of OtherTopics


Ignore:
Timestamp:
03/03/26 07:18:46 (3 weeks ago)
Author:
221181
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • OtherTopics

    v17 v18  
    140140За да се зголеми перформансата на базата на податоци, се применуваат стратегии за индексирање и се анализира споредбата на перформансите во состојби со индекс и без индекс. Тестовите се извршени со користење на командата EXPLAIN ANALYZE за реални мерења во реално време.
    141141
    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{{{
     147SELECT
     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
     152FROM warehouse_stock ws
     153JOIN warehouse w ON ws.warehouse_id = w.warehouse_id
     154JOIN product p ON ws.product_id = p.product_id
     155GROUP BY w.warehouse_id, w.name
     156ORDER BY total_stock_value DESC;
    166157}}}
    167158
    168159==== 1.1. Без индекс ====
     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}}}
    169191
    170192'''Метод''': Parallel Seq Scan (секвенцијално пребарување). Базата на податоци мора да ги прочита сите 500.000 редови еден по еден.