| 130 | | |
| 131 | | |
| 132 | | |
| | 130 | Овој пример ќе го извршиме и со CTEs табели и ќе видиме дали има разлика пред и по оптимизацијата. |
| | 131 | |
| | 132 | {{{ |
| | 133 | EXPLAIN (ANALYZE, BUFFERS) |
| | 134 | WITH expensive_players AS ( |
| | 135 | SELECT DISTINCT player_id |
| | 136 | FROM transfers |
| | 137 | WHERE transfer_fee > 10000000 |
| | 138 | ), |
| | 139 | player_appearances AS ( |
| | 140 | SELECT |
| | 141 | player_id, |
| | 142 | COUNT(DISTINCT game_id) AS appearances |
| | 143 | FROM appearances |
| | 144 | GROUP BY player_id |
| | 145 | HAVING COUNT(DISTINCT game_id) > 20 |
| | 146 | ), |
| | 147 | latest_value AS ( |
| | 148 | SELECT DISTINCT ON (player_id) |
| | 149 | player_id, |
| | 150 | market_value_in_eur, |
| | 151 | date |
| | 152 | FROM player_valuations |
| | 153 | ORDER BY player_id, date DESC |
| | 154 | ), |
| | 155 | market_stats AS ( |
| | 156 | SELECT |
| | 157 | player_id, |
| | 158 | AVG(market_value_in_eur) AS avg_market_value, |
| | 159 | MAX(market_value_in_eur) AS max_market_value |
| | 160 | FROM player_valuations |
| | 161 | GROUP BY player_id |
| | 162 | ) |
| | 163 | SELECT |
| | 164 | p.player_id, |
| | 165 | p.last_name, |
| | 166 | pa.appearances, |
| | 167 | ms.avg_market_value, |
| | 168 | ms.max_market_value, |
| | 169 | lv.market_value_in_eur AS latest_market_value |
| | 170 | FROM players p |
| | 171 | JOIN expensive_players ep |
| | 172 | ON p.player_id = ep.player_id |
| | 173 | JOIN player_appearances pa |
| | 174 | ON p.player_id = pa.player_id |
| | 175 | JOIN market_stats ms |
| | 176 | ON p.player_id = ms.player_id |
| | 177 | JOIN latest_value lv |
| | 178 | ON p.player_id = lv.player_id |
| | 179 | ORDER BY ms.max_market_value DESC |
| | 180 | LIMIT 5000; |
| | 181 | }}} |
| | 182 | |
| | 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 | |