| | 227 | |
| | 228 | |
| | 229 | == 3. Анализа и оптимизација на vw_public_artist_profiles == |
| | 230 | |
| | 231 | Погледот {{{vw_public_artist_profiles}}} се користи за прикажување на јавните профили на артистите и бендовите, нивниот град, жанр, просечен рејтинг и бројот на reviews. |
| | 232 | |
| | 233 | Прашалникот кој беше тестиран е следниот: |
| | 234 | |
| | 235 | {{{ |
| | 236 | SELECT * |
| | 237 | FROM vw_public_artist_profiles |
| | 238 | WHERE city = 'Skopje'; |
| | 239 | }}} |
| | 240 | |
| | 241 | === Време на извршување без индекси === |
| | 242 | |
| | 243 | '''3.1 - 15423.388 ms''' |
| | 244 | |
| | 245 | {{{ |
| | 246 | HashAggregate (cost=761290.87..761380.87 rows=6000 width=497) (actual time=15419.314..15419.430 rows=213 loops=1) |
| | 247 | Group Key: b.bookable_id, g.genre_name |
| | 248 | -> Hash Left Join |
| | 249 | -> Hash Left Join |
| | 250 | -> Hash Right Join |
| | 251 | -> Seq Scan on booking bk |
| | 252 | -> Seq Scan on offer o |
| | 253 | -> Seq Scan on review r |
| | 254 | Planning Time: 1.979 ms |
| | 255 | Execution Time: 15423.388 ms |
| | 256 | }}} |
| | 257 | |
| | 258 | При почетната анализа со {{{EXPLAIN ANALYZE}}} беше забележано дека PostgreSQL користи {{{Sequential Scan}}} врз табелите {{{Offer}}}, {{{Booking}}} и {{{Review}}}, како и голем број {{{Hash Join}}} операции. |
| | 259 | |
| | 260 | Поради огромниот број редици и aggregation операции, query-от имаше долго време на извршување. |
| | 261 | |
| | 262 | За оптимизација беа додадени следните индекси: |
| | 263 | |
| | 264 | {{{ |
| | 265 | CREATE INDEX idx_bookable_location |
| | 266 | ON Bookable(location_id); |
| | 267 | |
| | 268 | CREATE INDEX idx_location_city |
| | 269 | ON Location(city); |
| | 270 | |
| | 271 | CREATE INDEX idx_review_booking |
| | 272 | ON Review(booking_id); |
| | 273 | |
| | 274 | CREATE INDEX idx_offer_bookable |
| | 275 | ON Offer(bookable_id); |
| | 276 | |
| | 277 | CREATE INDEX idx_booking_offer |
| | 278 | ON Booking(offer_id); |
| | 279 | |
| | 280 | CREATE INDEX idx_bookable_rating |
| | 281 | ON Bookable(average_rating); |
| | 282 | }}} |
| | 283 | |
| | 284 | === Време на извршување со индекси === |
| | 285 | |
| | 286 | '''3.1 - 15251.957 ms''' |
| | 287 | |
| | 288 | {{{ |
| | 289 | HashAggregate (cost=761290.87..761380.87 rows=6000 width=497) (actual time=15247.945..15248.063 rows=213 loops=1) |
| | 290 | Group Key: b.bookable_id, g.genre_name |
| | 291 | -> Hash Left Join |
| | 292 | -> Hash Left Join |
| | 293 | -> Hash Right Join |
| | 294 | -> Seq Scan on booking bk |
| | 295 | -> Seq Scan on offer o |
| | 296 | -> Seq Scan on review r |
| | 297 | Planning Time: 1.898 ms |
| | 298 | Execution Time: 15251.957 ms |
| | 299 | }}} |
| | 300 | |
| | 301 | По оптимизацијата беше забележано умерено подобрување: |
| | 302 | |
| | 303 | * од ~15.4 s |
| | 304 | * на ~15.2 s |
| | 305 | |
| | 306 | И покрај додадените индекси, PostgreSQL продолжи да користи {{{Sequential Scan}}} бидејќи query-от обработува огромен број редици и користи сложени aggregation операции како {{{AVG}}}, {{{COUNT}}} и {{{GROUP BY}}}. |
| | 307 | |
| | 308 | Во вакви ситуации planner-от проценува дека sequential processing е поефикасен од index traversal, па индексите имаат ограничено влијание врз вкупното време на извршување. |