Changes between Version 3 and Version 4 of Monitoring


Ignore:
Timestamp:
05/18/26 10:31:18 (8 days ago)
Author:
213192
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Monitoring

    v3 v4  
    3434}}}
    3535
     36{{{
     37->  Bitmap Index Scan on idx_pv_value  (cost=0.00..1714.81 rows=156585 width=0) (actual time=6.292..6.293 rows=157128.00 loops=1)"
     38Index Cond: (market_value_in_eur > 1000000)"
     39Index Searches: 1"
     40Buffers: shared read=138"
     41->  Hash  (cost=1123.00..1123.00 rows=20000 width=12) (actual time=5.863..5.865 rows=20000.00 loops=1)"
     42Buckets: 32768  Batches: 1  Memory Usage: 1120kB"
     43Buffers: shared hit=923"
     44->  Seq Scan on players p  (cost=0.00..1123.00 rows=20000 width=12) (actual time=0.032..3.416 rows=20000.00 loops=1)"
     45Buffers: shared hit=923"
     46}}}
     47
    3648Пред оптимизацијата, прашалникот ги дава следниве резултати: 273мс време на извршување, Seq Scan, процесирани редици 131462, одстранети редици 339478, Sort Type: External Merge. Главните проблеми се тоа што има Full Sequential Scan на player_valuations и скапо филтрирање.
    3749
     
    6779
    6880Query-то прави join помеѓу transfers, players, club_games, филтрира трансфери по 2021 година, ги исклучува NULL transfer fees, сортира по transfer fee, враќа top 10,000 резултати.
     81
     82{{{
     83->  Hash Join  (cost=1373.00..3229.21 rows=12332 width=20) (actual time=7.704..30.039 rows=4131.00 loops=2)"
     84Hash Cond: (t.player_id = p.player_id)"
     85Buffers: shared hit=1853 read=1094"
     86->  Parallel Seq Scan on transfers t  (cost=0.00..1686.65 rows=12332 width=16) (actual time=0.312..17.129 rows=12001.50 loops=2)"
     87Filter: ((transfer_fee IS NOT NULL) AND ((transfer_date)::text >= '2021-01-01'::text))"
     88Rows Removed by Filter: 27822"
     89Buffers: shared hit=7 read=1094"
     90}}}
    6991
    7092ПРЕД ОПТИМИЗАЦИЈА прашалникот има време на извршување од 7.8с, чита 2.5 милиони редици, користи Seq Scan, Incremental Sort и Hash Join + Nested Loop. Главен проблем е што PostgreSQL прави SeqScan на transfers и players - прашалникот враќа голем дел од табелата. Потоа, ги додаваме следниве индекси:
     
    124146CREATE INDEX idx_player_valuations_player_value
    125147ON player_valuations(player_id, market_value_in_eur);
     148}}}
     149
     150{{{
     151->  Index Only Scan using idx_transfers_player_fee on transfers t  (cost=0.42..1686.15 rows=2782 width=4) (actual time=0.048..5.984 rows=2786.00 loops=1)"
     152Index Cond: (transfer_fee > '5000000'::double precision)"
     153Heap Fetches: 34"
     154Index Searches: 1"
     155Buffers: shared hit=23 read=251"
     156->  Hash  (cost=1123.00..1123.00 rows=20000 width=12) (actual time=7.017..7.018 rows=20000.00 loops=1)"
     157Buckets: 32768  Batches: 1  Memory Usage: 1120kB"
     158Buffers: shared read=923"
     159->  Seq Scan on players p  (cost=0.00..1123.00 rows=20000 width=12) (actual time=0.175..4.014 rows=20000.00 loops=1)"
     160Buffers: shared read=923"
     161->  Index Only Scan using idx_appearances_player_game on appearances a  (cost=0.43..4.67 rows=119 width=8) (actual time=0.008..0.087 rows=271.04 loops=1038)"
     162Index Cond: (player_id = p.player_id)"
     163Heap Fetches: 84854"
     164Index Searches: 1038"
     165Buffers: shared hit=88323 read=405"
    126166}}}
    127167
     
    181221}}}
    182222
    183 {| class="wikitable sortable" style="text-align:center; width:100%;"
    184 ! Metric
    185 ! Non-CTE Query
    186 ! WITH CTE Query
    187 
    188 ! Improvement / Observation
    189 Execution Time
    190 ~3274 ms
    191 ~1753 ms
    192 ✅ ~46% побрзо извршување
    193 -
    194 Final Rows Returned
    195 1038
    196 690
    197 ✅ Помал финален dataset
    198 -
    199 Intermediate Rows Processed
    200 ~9.25M rows
    201 ~15k rows
    202 Огромно намалување на обработени редови
    203 -
    204 Join Explosion
    205 Многу висок
    206 Значително намален
    207  Подобар execution flow
    208 -
    209 Scan Strategy
    210 Hash Right Join + Seq Scan
    211 Merge Join + Index Scan
    212 ✅ Пооптимизиран planner strategy
    213 -
    214 Seq Scan Usage
    215 Високо
    216 Намалено
    217 ✅ Помал full table scanning
    218 -
    219 Index Usage
    220 Делумно искористени индекси
    221 Значително подобро искористени индекси
    222 ✅ Подобрен access path
    223 -
    224 Temporary Files
    225 ✅ Да
    226 ❌ Не
    227 ✅ Нема disk spill
    228 -
    229 Disk Spill
    230 ✅ External spill
    231 ❌ Нема spill
    232 ✅ Подобра memory utilization
    233 -
    234 Sort Performance
    235 Temp read/write operations
    236 In-memory quicksort
    237 ✅ Побрзо сортирање
    238 -
    239 Buffers Hit
    240 ~92k
    241 ~947k
    242 ⚠️ Повеќе cache processing поради index traversal
    243 -
    244 Heap Fetches
    245 Високи
    246 Сè уште присутни
    247 ⚠️ Visibility map не е целосно оптимизиран
    248 -
    249 Planner Complexity
    250 Висока
    251 Подобро организирана
    252 ✅ Cleaner execution plan
    253 -
    254 Aggregation Cost
    255 Многу висока
    256 Намалена
    257 ✅ Помал aggregation workload
    258 -
    259 Overall Efficiency
    260 Тежок аналитички query
    261 Значително поефикасен query
    262 }
    263 
    264 
    265 
    266 
    267 
     223Според добиените резултати, може да забележиме дека времето на извршување се намалило од 3274мс на 1753мс (46% побрзо), наместо 1038 редици добиваме 690, без CTE обработувавме 9 милиони редови додека сега само 15 илјади, немаме толкав join explosion.
     224
     225{{{
     226->  Bitmap Heap Scan on transfers  (cost=41.46..1213.45 rows=1701 width=4) (actual time=0.267..2.623 rows=1640.00 loops=1)"
     227Recheck Cond: (transfer_fee > '10000000'::double precision)"
     228Heap Blocks: exact=514"
     229Buffers: shared hit=6 read=514"
     230->  Bitmap Index Scan on idx_transfers_big_fees  (cost=0.00..41.04 rows=1701 width=0) (actual time=0.208..0.208 rows=1640.00 loops=1)"
     231Index Cond: (transfer_fee > '10000000'::double precision)"
     232Index Searches: 1"
     233Buffers: shared read=6"
     234}}}
     235
     236Може да забележиме дека CTE значително го намалуваат dataset-от, овозможува подобар planner strategy и подобро користи индекси. Најважни промени кај CTE верзијата се: рано ги филтрира потребните играчи (немаме милиони редици за обработување), го намалува бројот на редови пред JOIN операциите (со што избегнува join explosion). Сепак индексите сами по себе не се доволни да направат огромна разлика, туку најважно е како ќе го структурираме прашалникот.
     237
     238
     239
     240
     241