| | 478 | |
| | 479 | |
| | 480 | == 6. Анализа и оптимизација на vw_artist_schedule == |
| | 481 | |
| | 482 | Погледот {{{vw_artist_schedule}}} се користи за прикажување на распоредот и достапноста на артистите и бендовите. Овој поглед се користи за пребарување според статус на достапност, конкретен артист и временски период. |
| | 483 | |
| | 484 | Прашалниците кои беа тестирани се следните: |
| | 485 | |
| | 486 | {{{ |
| | 487 | -- 6.1 |
| | 488 | SELECT * |
| | 489 | FROM vw_artist_schedule |
| | 490 | WHERE status = 'AVAILABLE'; |
| | 491 | |
| | 492 | -- 6.2 |
| | 493 | SELECT * |
| | 494 | FROM vw_artist_schedule |
| | 495 | WHERE bookable_id = 150; |
| | 496 | |
| | 497 | -- 6.3 |
| | 498 | SELECT * |
| | 499 | FROM vw_artist_schedule |
| | 500 | WHERE start_datetime >= '2026-07-01' |
| | 501 | AND start_datetime < '2026-08-01'; |
| | 502 | }}} |
| | 503 | |
| | 504 | === Време на извршување без индекси === |
| | 505 | |
| | 506 | '''6.1 - 192.437 ms''' |
| | 507 | |
| | 508 | {{{ |
| | 509 | Hash Join (cost=28.50..17676.52 rows=199740 width=43) (actual time=37.987..185.463 rows=199835 loops=1) |
| | 510 | -> Seq Scan on availabilityslot av |
| | 511 | Filter: ((status)::text = 'AVAILABLE'::text) |
| | 512 | -> Seq Scan on bookable b |
| | 513 | Planning Time: 0.401 ms |
| | 514 | Execution Time: 192.437 ms |
| | 515 | }}} |
| | 516 | |
| | 517 | '''6.2 - 51.157 ms''' |
| | 518 | |
| | 519 | {{{ |
| | 520 | Nested Loop (cost=1000.27..13156.88 rows=993 width=43) (actual time=5.494..51.071 rows=1017 loops=1) |
| | 521 | -> Index Scan using bookable_pkey on bookable b |
| | 522 | -> Parallel Seq Scan on availabilityslot av |
| | 523 | Filter: (bookable_id = 150) |
| | 524 | Planning Time: 0.178 ms |
| | 525 | Execution Time: 51.157 ms |
| | 526 | }}} |
| | 527 | |
| | 528 | '''6.3 - 96.327 ms''' |
| | 529 | |
| | 530 | {{{ |
| | 531 | Hash Join (cost=28.50..18925.91 rows=104939 width=43) (actual time=5.043..92.669 rows=103896 loops=1) |
| | 532 | -> Seq Scan on availabilityslot av |
| | 533 | Filter: ((start_datetime >= '2026-07-01 00:00:00'::timestamp without time zone) |
| | 534 | AND (start_datetime < '2026-08-01 00:00:00'::timestamp without time zone)) |
| | 535 | -> Seq Scan on bookable b |
| | 536 | Planning Time: 0.345 ms |
| | 537 | Execution Time: 96.327 ms |
| | 538 | }}} |
| | 539 | |
| | 540 | При почетната анализа со {{{EXPLAIN ANALYZE}}} беше забележано дека PostgreSQL користи {{{Sequential Scan}}} и {{{Parallel Sequential Scan}}} врз табелата {{{AvailabilitySlot}}}. Ова значеше дека системот чита голем број редици за да ги пронајде потребните податоци, што предизвикуваше дополнително време на извршување. |
| | 541 | |
| | 542 | За оптимизација беа додадени следните индекси: |
| | 543 | |
| | 544 | {{{ |
| | 545 | CREATE INDEX idx_availability_status |
| | 546 | ON AvailabilitySlot(status); |
| | 547 | |
| | 548 | CREATE INDEX idx_availability_bookable |
| | 549 | ON AvailabilitySlot(bookable_id); |
| | 550 | |
| | 551 | CREATE INDEX idx_availability_start |
| | 552 | ON AvailabilitySlot(start_datetime); |
| | 553 | |
| | 554 | CREATE INDEX idx_bookable_id |
| | 555 | ON Bookable(bookable_id); |
| | 556 | }}} |
| | 557 | |
| | 558 | === Време на извршување со индекси === |
| | 559 | |
| | 560 | '''6.1 - 109.389 ms''' |
| | 561 | |
| | 562 | {{{ |
| | 563 | Hash Join (cost=2260.91..14905.68 rows=199740 width=43) (actual time=9.156..102.463 rows=199835 loops=1) |
| | 564 | -> Bitmap Heap Scan on availabilityslot av |
| | 565 | -> Bitmap Index Scan on idx_availability_status |
| | 566 | -> Seq Scan on bookable b |
| | 567 | Planning Time: 0.846 ms |
| | 568 | Execution Time: 109.389 ms |
| | 569 | }}} |
| | 570 | |
| | 571 | '''6.2 - 2.111 ms''' |
| | 572 | |
| | 573 | {{{ |
| | 574 | Nested Loop (cost=12.40..2934.21 rows=993 width=43) (actual time=0.327..2.041 rows=1017 loops=1) |
| | 575 | -> Index Scan using idx_bookable_id on bookable b |
| | 576 | -> Bitmap Heap Scan on availabilityslot av |
| | 577 | -> Bitmap Index Scan on idx_availability_bookable |
| | 578 | Planning Time: 0.206 ms |
| | 579 | Execution Time: 2.111 ms |
| | 580 | }}} |
| | 581 | |
| | 582 | '''6.3 - 73.602 ms''' |
| | 583 | |
| | 584 | {{{ |
| | 585 | Hash Join (cost=2260.55..13732.05 rows=104939 width=43) (actual time=11.382..70.012 rows=103896 loops=1) |
| | 586 | -> Bitmap Heap Scan on availabilityslot av |
| | 587 | -> Bitmap Index Scan on idx_availability_start |
| | 588 | -> Seq Scan on bookable b |
| | 589 | Planning Time: 0.410 ms |
| | 590 | Execution Time: 73.602 ms |
| | 591 | }}} |
| | 592 | |
| | 593 | По оптимизацијата PostgreSQL започна да користи: |
| | 594 | |
| | 595 | * {{{Bitmap Index Scan}}} |
| | 596 | * {{{Bitmap Heap Scan}}} |
| | 597 | * {{{Index Scan}}} |
| | 598 | |
| | 599 | Најголемо подобрување беше забележано кај query-от што пребарува според {{{bookable_id}}}: |
| | 600 | |
| | 601 | * од ~51 ms |
| | 602 | * на ~2 ms |
| | 603 | |
| | 604 | Кај query-от што пребарува според {{{status = 'AVAILABLE'}}} времето на извршување се намали: |
| | 605 | |
| | 606 | * од ~192 ms |
| | 607 | * на ~109 ms |
| | 608 | |
| | 609 | Исто така, query-от што пребарува според временски период се подобри: |
| | 610 | |
| | 611 | * од ~96 ms |
| | 612 | * на ~73 ms |
| | 613 | |
| | 614 | По оптимизацијата PostgreSQL престана да користи {{{Sequential Scan}}} и започна да ги пронаоѓа потребните редици преку индексно пребарување, што значително го подобри времето на извршување и ја намали количината на прочитани податоци. |