| | 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)" |
| | 152 | Index Cond: (transfer_fee > '5000000'::double precision)" |
| | 153 | Heap Fetches: 34" |
| | 154 | Index Searches: 1" |
| | 155 | Buffers: 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)" |
| | 157 | Buckets: 32768 Batches: 1 Memory Usage: 1120kB" |
| | 158 | Buffers: 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)" |
| | 160 | Buffers: 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)" |
| | 162 | Index Cond: (player_id = p.player_id)" |
| | 163 | Heap Fetches: 84854" |
| | 164 | Index Searches: 1038" |
| | 165 | Buffers: shared hit=88323 read=405" |
| 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)" |
| | 227 | Recheck Cond: (transfer_fee > '10000000'::double precision)" |
| | 228 | Heap Blocks: exact=514" |
| | 229 | Buffers: 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)" |
| | 231 | Index Cond: (transfer_fee > '10000000'::double precision)" |
| | 232 | Index Searches: 1" |
| | 233 | Buffers: shared read=6" |
| | 234 | }}} |
| | 235 | |
| | 236 | Може да забележиме дека CTE значително го намалуваат dataset-от, овозможува подобар planner strategy и подобро користи индекси. Најважни промени кај CTE верзијата се: рано ги филтрира потребните играчи (немаме милиони редици за обработување), го намалува бројот на редови пред JOIN операциите (со што избегнува join explosion). Сепак индексите сами по себе не се доволни да направат огромна разлика, туку најважно е како ќе го структурираме прашалникот. |
| | 237 | |
| | 238 | |
| | 239 | |
| | 240 | |
| | 241 | |