| | 1 | = Други теми = |
| | 2 | |
| | 3 | Скрипти: [attachment:other_topics.sql] (индекси, оптимизации и безбедносни мерки) и [attachment:perf_test_data.sql] (тест-податоци за анализа на перформансите). Редослед на извршување: schema_creation.sql, advanced_db.sql, other_topics.sql, data_load.sql. |
| | 4 | |
| | 5 | == Перформанси на SQL == |
| | 6 | |
| | 7 | === Методологија === |
| | 8 | |
| | 9 | Со примерните податоци (72 пријави) секоја табела зафаќа неколку страници, па PostgreSQL секогаш ја чита целата табела и индексите не се користат. Затоа анализата е направена во посебна шема perf, креирана со perf_test_data.sql, со иста структура, примарни клучеви и единствени ограничувања како project, и со синтетички податоци за период 2021-2026: |
| | 10 | |
| | 11 | * 100 000 пријави (околу 4 % отворени), 385 453 записи во историјата на статуси, 99 042 доделувања, 49 513 коментари, 100 000 фотографии, 5 000 граѓани и 40 работници. |
| | 12 | |
| | 13 | Секој прашалник е извршен со EXPLAIN (ANALYZE, BUFFERS) три пати, пред и по креирањето на индексите, и е земено најкраткото време. Паралелното извршување е исклучено (max_parallel_workers_per_gather = 0), за плановите да бидат споредливи. Во плановите подолу се прикажани главните чворови; бројките се на PostgreSQL 16. |
| | 14 | |
| | 15 | === Предложени индекси === |
| | 16 | |
| | 17 | {{{#!sql |
| | 18 | -- историјата на пријава и последниот статус (тригери, UC0004, погледи, извештаи) |
| | 19 | CREATE INDEX idx_status_logs_report_changed ON status_logs (report_id, changed_at, log_id); |
| | 20 | |
| | 21 | -- активните пријави на работник (UC0005) и оптовареност (UC0007) |
| | 22 | CREATE INDEX idx_assignments_worker ON assignments (worker_id, report_id); |
| | 23 | |
| | 24 | -- пријавите на граѓанин (UC0004) |
| | 25 | CREATE INDEX idx_reports_citizen ON reports (citizen_id, created_at); |
| | 26 | |
| | 27 | -- извештаи за даден период |
| | 28 | CREATE INDEX idx_reports_created ON reports (created_at); |
| | 29 | |
| | 30 | -- слични активни пријави во близина; делумен индекс само за отворените пријави |
| | 31 | CREATE INDEX idx_reports_active_location ON reports (category_id, latitude, longitude) |
| | 32 | WHERE status NOT IN ('resolved', 'rejected'); |
| | 33 | |
| | 34 | -- коментари и фотографии на пријава (UC0004) |
| | 35 | CREATE INDEX idx_comments_report ON comments (report_id); |
| | 36 | CREATE INDEX idx_photos_report ON photos (report_id); |
| | 37 | }}} |
| | 38 | |
| | 39 | Надворешните клучеви во PostgreSQL не креираат индекси автоматски, па колоните report_id и worker_id во табелите-деца немаа индекси. Делумниот |