Changes between Version 61 and Version 62 of QueryOptimization


Ignore:
Timestamp:
05/17/26 13:23:40 (9 days ago)
Author:
231027
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v61 v62  
    3333Иницијалното време за извршување на погледот изнесува 3.249s (3249ms). Ова е исклучително бавно и неприфатливо за една веб-апликација, каде што секој одзив над 500ms се смета за критичен.
    3434
    35 ==== 4. Анализа на планот на извршување:
     35==== 4. Анализа на планот на извршување (без индекси):
    3636
    3737Иако базата се обидува да користи постоечки '''Primary Key''' индекси, главниот проблем се јавува во спојувањето на четирите табели `Performer`, `Event_Happening_Performer`, `Event_Happening`, `Event`.
     
    215215}}}
    216216
    217 ==== Без индекс:
     217==== 1. Примарен филтер:
     218
     219Примарен филтер за овој поглед е `venue_id`. Ова е логично бидејќи корисникот или администраторот најчесто бараат преглед на седиштата за една специфична сала. Секундарен филтер е `seat_number` при проверка или промена на конкретно седиште.
     220
     221==== 2. Случај на употреба:
     222
     223Погледот се користи за прикажување на графичката мапа на седишта при процесот на резервација. Корисникот избира настан, па сала, и системот мора моментално да ја вчита структурата на салата. Бавноста тука директно влијае на продажбата на билети - ако мапата се вчитува со секунди, корисникот може да се откаже.
     224
     225==== 3. Иницијално време:
     226
     227'''SELECT''': 2.164s (2164ms)
     228
     229'''UPDATE''': 312.239s (околу 5.2 минути)
     230Времето за '''UPDATE''' е критично. Ова значи дека ако системот треба да ажурира статус на седиште, целата база би била под огромен притисок.
     231
     232==== 4. Анализа на планот на извршување (без индекси):
     233
     234Кај '''SELECT''' операцијата, базата користи '''Parallel Index Scan''' врз табелата `Section` и троши многу време на филтрирање на редови кои не одговараат (Rows Removed by Filter: 27502).
     235
     236Кај '''UPDATE''' операцијата се случува најлошото сценарио: '''Seq Scan'''. Базата мора да ги прочита сите 20,753,209 редови во табелата `Seat` за да го најде седиштето со број 999999. Тоа е причината за времето од 312s.
    218237
    219238 * '''SELECT'''
     
    289308Времето за ажурирање од 312 s е неприфатливо за интеракција со мапа на седишта во реално време. Со поставување индекси на `seat_number` и `venue_id`, пребарувањето и промената на статусот на седиштата се извршуваат за милисекунди наместо за неколку минути.
    290309
    291 ==== Оптимизација:
     310==== 5. Оптимизација и индексирање:
     311
     312За да се елиминира целосното скенирање на табелите, се воведуваат:
     313
     314 * `idx_section_venue_id`: Овозможува веднаш да се најдат само секциите што му припаѓаат на соодветната сала.
     315
     316 * `idx_seat_section_id`: Го забрзува поврзувањето на седиштата со нивните секции.
     317
     318 * `idx_seat_number`: Клучен индекс кој го претвора петминутното пребарување во инстантно пронаоѓање на седиштето.
    292319
    293320{{{
     
    304331}}}
    305332
    306 ==== Со индекс:
     333==== 6. Резултат по оптимизација:
     334
     335'''SELECT''': Намалено на 0.572ms (забрзување од ~3800 пати).
     336
     337'''UPDATE''': Намалено на 0.461ms.
    307338
    308339 * '''SELECT'''