Changes between Version 18 and Version 19 of OtherTopics


Ignore:
Timestamp:
03/03/26 07:25:41 (3 weeks ago)
Author:
221181
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • OtherTopics

    v18 v19  
    160160
    161161Кога се поврзува табелата **warehouse_stock** со табелата **product** преку колоната **product_id** (JOIN), ако нема индекс, базата на податоци ќе ги скенира сите редови.
     162
     163{{{
     164EXPLAIN ANALYZE
     165SELECT w.name, SUM(ws.quantity_on_hand), SUM(ws.quantity_on_hand * p.unit_price)
     166FROM stock_management.warehouse_stock ws
     167JOIN stock_management.warehouse w ON ws.warehouse_id = w.warehouse_id
     168JOIN stock_management.product p ON ws.product_id = p.product_id
     169GROUP BY w.warehouse_id, w.name;
     170}}}
    162171
    163172{{{
     
    190199}}}
    191200
    192 '''Метод''': Parallel Seq Scan (секвенцијално пребарување). Базата на податоци мора да ги прочита сите 500.000 редови еден по еден.
    193 
    194 '''Времетраење: 173.154 ms'''
     201'''Времетраење: 103.080 ms'''
    195202
    196203'''Анализа:''' Многу бавно.
    197204
    198 [[Image(without_index_1.png, 800px)]]
    199 
    200 ==== 1.2. Стратегија за индексирање (Partial Index) ====
    201 
    202 Наместо да се индексира целата табела, е креиран делумен индекс (Partial Index) кој ги вклучува само записите каде што status = 'Pending'.
    203 
    204 Ова го намалува големината на индексот и ја забрзува извршувањето на барањето.
     205==== 1.2. Со индекс ====
     206
     207За пребарувањето по product_id во табелата warehouse_stock да биде побрзо
    205208
    206209'''Применет индекс:'''
    207210{{{
    208 CREATE INDEX idx_po_status_pending ON purchase_order(expected_delivery_date) WHERE status = 'Pending';
    209 }}}
    210 
    211 ==== 1.3. Со индекс ====
    212 
    213 '''Метод''': Index Scan.
    214 
    215 '''Времетраење: 94.976 ms '''
     211CREATE INDEX idx_wh_stock_product_id ON stock_management.warehouse_stock(product_id);
     212}}}
     213
     214{{{
     215"HashAggregate  (cost=705.70..706.95 rows=100 width=262) (actual time=29.541..29.548 rows=3.00 loops=1)"
     216"  Group Key: w.warehouse_id"
     217"  Batches: 1  Memory Usage: 32kB"
     218"  Buffers: shared hit=164"
     219"  ->  Hash Join  (cost=191.75..518.20 rows=15000 width=232) (actual time=2.793..18.549 rows=15000.00 loops=1)"
     220"        Hash Cond: (ws.product_id = p.product_id)"
     221"        Buffers: shared hit=164"
     222"        ->  Hash Join  (cost=12.25..299.29 rows=15000 width=230) (actual time=0.060..9.059 rows=15000.00 loops=1)"
     223"              Hash Cond: (ws.warehouse_id = w.warehouse_id)"
     224"              Buffers: shared hit=97"
     225"              ->  Seq Scan on warehouse_stock ws  (cost=0.00..246.00 rows=15000 width=12) (actual time=0.025..1.711 rows=15000.00 loops=1)"
     226"                    Buffers: shared hit=96"
     227"              ->  Hash  (cost=11.00..11.00 rows=100 width=222) (actual time=0.019..0.021 rows=3.00 loops=1)"
     228"                    Buckets: 1024  Batches: 1  Memory Usage: 9kB"
     229"                    Buffers: shared hit=1"
     230"                    ->  Seq Scan on warehouse w  (cost=0.00..11.00 rows=100 width=222) (actual time=0.011..0.013 rows=3.00 loops=1)"
     231"                          Buffers: shared hit=1"
     232"        ->  Hash  (cost=117.00..117.00 rows=5000 width=10) (actual time=2.710..2.710 rows=5000.00 loops=1)"
     233"              Buckets: 8192  Batches: 1  Memory Usage: 279kB"
     234"              Buffers: shared hit=67"
     235"              ->  Seq Scan on product p  (cost=0.00..117.00 rows=5000 width=10) (actual time=0.010..1.133 rows=5000.00 loops=1)"
     236"                    Buffers: shared hit=67"
     237"Planning:"
     238"  Buffers: shared hit=12"
     239"Planning Time: 0.761 ms"
     240"Execution Time: 29.767 ms"
     241}}}
     242
     243
     244'''Времетраење: 29.767 ms '''
    216245
    217246'''Анализа:''' Многу по брзо.
    218 
    219 [[Image(with_index_1.png, 800px)]]
    220 
    221 === Сценарио 2: Пребарување на производи ===
    222 
    223 Цел: Корисникот да може да пребарува производи според името (на пример: производи што започнуваат со "Laptop").
    224 
    225 {{{
    226 SELECT * FROM product WHERE name LIKE 'Laptop%';
    227 EXPLAIN ANALYZE SELECT * FROM product WHERE name LIKE 'Laptop%';
    228 }}}
    229 
    230 ==== 2.1. Без индекс ====
    231 
    232 '''Метод''': Seq Scan. Сите 100.000 редови со производи се проверени еден по еден со споредба на текст.
    233 
    234 '''Времетраење: 142.270 ms'''
    235 
    236 '''Анализа:''' Многу бавно.
    237 
    238 [[Image(without_index_2.png, 800px)]]
    239 
    240 ==== 2.2. Стратегија за индексирање (Partial Index) ====
    241 
    242 За да се забрзаат текстуалните пребарувања, е применет B-Tree индекс на колоната '''name'''.
    243 Параметарот text_pattern_ops овозможува LIKE барањата да можат да го користат индексот.
    244 
    245 '''Применет индекс:'''
    246 {{{
    247 CREATE INDEX idx_product_name ON product(name text_pattern_ops);
    248 }}}
    249 
    250 ==== 2.3. Со индекс ====
    251 
    252 
    253 '''Метод''': Index Scan.
    254 
    255 '''Времетраење: 0.470 ms '''
    256 
    257 '''Анализа:''' Многу по брзо.
    258 
    259 [[Image(with_index_2.png, 800px)]]