| | 1 | = Фаза 3 - Индекси и оптимизација на прашалници = |
| | 2 | |
| | 3 | Проект: Alumni Career Tracker |
| | 4 | |
| | 5 | |
| | 6 | == View 1: v_companies_by_industry == |
| | 7 | |
| | 8 | 1. Примарен филтер за погледот v_companies_by_industry ќе биде според industry_name. |
| | 9 | 2. Погледот се користи за преглед на компании групирани по индустрија. Перформансите се важни за течно работење на апликацијата. |
| | 10 | 3. Иницијалното време за извршување на погледот е 296ms. |
| | 11 | {{{ |
| | 12 | SELECT * FROM v_companies_by_industry WHERE industry_name = 'Information Technology'; |
| | 13 | }}} |
| | 14 | 4. Execution планот покажува Seq Scan на Industry табелата, но времето е мало (0.025ms) бидејќи табелата е мала. Нема потреба од индекс. Времето изминато во извршување на операциите INSERT и UPDATE изнесува: |
| | 15 | {{{ |
| | 16 | INSERT INTO Industry(industry_name, sector_category) VALUES('!TestIndustryAAA', '!TestSector'); -- 79ms |
| | 17 | UPDATE Industry SET sector_category = '!UpdatedSector' WHERE industry_name = '!TestIndustryAAA'; -- 64ms |
| | 18 | }}} |
| | 19 | 5. Нема потреба од индексирање — сите операции во execution планот се брзи. |
| | 20 | 6. Времето на извршување на операциите останува исто. |
| | 21 | |
| | 22 | ---- |
| | 23 | |
| | 24 | == View 2: v_user_full_career == |
| | 25 | |
| | 26 | 1. Примарен филтер за погледот v_user_full_career ќе биде според user_id. |
| | 27 | 2. Погледот се користи за преглед на целосната кариера на корисник (студии и вработување). Перформансите се важни. |
| | 28 | 3. Иницијалното време за извршување на погледот е 5.356s. |
| | 29 | {{{ |
| | 30 | SELECT * FROM v_user_full_career WHERE user_id = 2676094; |
| | 31 | }}} |
| | 32 | Ова не е прифатливо време па затоа пристапуваме кон индексирање. |
| | 33 | 4. Најбавните операции се Parallel Seq Scan на табелите Employment (660ms) и Studies (364ms). Времето изминато во извршување на операциите INSERT и UPDATE пред индексирање изнесува: |
| | 34 | {{{ |
| | 35 | INSERT INTO "User"(first_name, last_name, email) VALUES('Test', 'User', 'testuser111@test.com'); -- 465ms |
| | 36 | UPDATE "User" SET city = 'Skopje' WHERE email = 'testuser111@test.com'; -- 345ms |
| | 37 | }}} |
| | 38 | 5. Времето изминато во извршување на query-то со индекси изнесува 55ms, и тоа е прифатливо време. |
| | 39 | {{{ |
| | 40 | CREATE INDEX idx_employment_user_id ON Employment(user_id DESC NULLS LAST); |
| | 41 | CREATE INDEX idx_studies_user_id ON Studies(user_id DESC NULLS LAST); |
| | 42 | SELECT * FROM v_user_full_career WHERE user_id = 2676094; |
| | 43 | }}} |
| | 44 | Execution планот по индексирање — сите операции користат Index Scan. |
| | 45 | 6. Времето изминато во извршување на операциите INSERT и UPDATE по индексирање изнесува: |
| | 46 | {{{ |
| | 47 | INSERT INTO "User"(first_name, last_name, email) VALUES('Test2', 'User2', 'testuser222@test.com'); -- 619ms |
| | 48 | UPDATE "User" SET city = 'Kicevo' WHERE email = 'testuser222@test.com'; -- 289ms |
| | 49 | }}} |
| | 50 | |
| | 51 | ---- |
| | 52 | |
| | 53 | == View 3: v_student_academic_profile == |
| | 54 | |
| | 55 | 1. Примарен филтер за погледот v_student_academic_profile ќе биде според user_id. |
| | 56 | 2. Погледот се користи за преглед на академскиот профил на студент. Перформансите се важни. |
| | 57 | 3. Иницијалното време за извршување на погледот е 51ms. Ова е прифатливо време. |
| | 58 | {{{ |
| | 59 | SELECT * FROM v_student_academic_profile WHERE user_id = 2676094; |
| | 60 | }}} |
| | 61 | 4. Execution планот покажува дека сите операции се брзи благодарение на веќе постојните индекси. Времето изминато во извршување на операциите INSERT и UPDATE изнесува: |
| | 62 | {{{ |
| | 63 | INSERT INTO "User"(first_name, last_name, email) VALUES('Test3', 'User3', 'testuser333@test.com'); -- 466ms |
| | 64 | UPDATE "User" SET city = 'Ohrid' WHERE email = 'testuser333@test.com'; -- 50ms |
| | 65 | }}} |
| | 66 | 5. Нема потреба да се преуреди прашалникот. |
| | 67 | 6. Времето на извршување на операциите останува исто. |
| | 68 | |
| | 69 | ---- |
| | 70 | |
| | 71 | == View 4: v_event_participants == |
| | 72 | |
| | 73 | 1. Примарен филтер за погледот v_event_participants ќе биде според event_id. |
| | 74 | 2. Погледот се користи за преглед на учесници на настан. Перформансите се важни. |
| | 75 | 3. Иницијалното време за извршување на погледот е 318ms. |
| | 76 | {{{ |
| | 77 | SELECT * FROM v_event_participants WHERE event_id = 1; |
| | 78 | }}} |
| | 79 | 4. Execution планот покажува дека сите операции користат Index Scan — нема бавни операции. Времето изминато во извршување на операциите INSERT и UPDATE изнесува: |
| | 80 | {{{ |
| | 81 | INSERT INTO Event(name, date, location, company_id) VALUES('TestEvent111', '2026-01-01', 'Skopje', 1); -- 1.389s |
| | 82 | UPDATE Event SET location = 'Berovo' WHERE name = 'TestEvent111'; -- 389ms |
| | 83 | }}} |
| | 84 | 5. Нема потреба да се преуреди прашалникот. |
| | 85 | 6. Времето на извршување на операциите останува исто. |
| | 86 | |
| | 87 | ---- |
| | 88 | |
| | 89 | == View 5: v_faculty_programs == |
| | 90 | |
| | 91 | 1. Примарен филтер за погледот v_faculty_programs ќе биде според faculty_id. |
| | 92 | 2. Погледот се користи за преглед на студиски програми по факултет. Перформансите се важни. |
| | 93 | 3. Иницијалното време за извршување на погледот е 206ms. Ова е прифатливо време. |
| | 94 | {{{ |
| | 95 | SELECT * FROM v_faculty_programs WHERE faculty_id = 1; |
| | 96 | }}} |
| | 97 | 4. Execution планот покажува Seq Scan на мали табели (University, Faculty, StudyProgram) — нема потреба од индекс. Времето изминато во извршување на операциите INSERT и UPDATE изнесува: |
| | 98 | {{{ |
| | 99 | INSERT INTO Faculty(name, university_id) VALUES('TestFaculty111', 1); -- 310ms |
| | 100 | UPDATE Faculty SET address = 'Test Address' WHERE name = 'TestFaculty111'; -- 187ms |
| | 101 | }}} |
| | 102 | 5. Нема потреба да се преуреди прашалникот. |
| | 103 | 6. Времето на извршување на операциите останува исто. |
| | 104 | |
| | 105 | ---- |
| | 106 | |
| | 107 | == View 6: v_employment_history == |
| | 108 | |
| | 109 | 1. Примарен филтер за погледот v_employment_history ќе биде според user_id. |
| | 110 | 2. Погледот се користи за преглед на историјата на вработување на корисник. Перформансите се важни. |
| | 111 | 3. Иницијалното време за извршување на погледот е 96ms. Ова е прифатливо време. |
| | 112 | {{{ |
| | 113 | SELECT * FROM v_employment_history WHERE user_id = 2676094; |
| | 114 | }}} |
| | 115 | 4. Execution планот покажува дека сите операции користат Index Scan благодарение на индексите додадени во View 2. Времето изминато во извршување на операциите INSERT и UPDATE изнесува: |
| | 116 | {{{ |
| | 117 | INSERT INTO "User"(first_name, last_name, email) VALUES('Test4', 'User4', 'testuser444@test.com'); -- 207ms |
| | 118 | UPDATE "User" SET city = 'Stip' WHERE email = 'testuser444@test.com'; -- 357ms |
| | 119 | }}} |
| | 120 | 5. Нема потреба да се преуреди прашалникот. |
| | 121 | 6. Времето на извршување на операциите останува исто. |
| | 122 | |
| | 123 | ---- |
| | 124 | |
| | 125 | == View 7: v_user_skills == |
| | 126 | |
| | 127 | 1. Примарен филтер за погледот v_user_skills ќе биде според user_id. |
| | 128 | 2. Погледот се користи за преглед на вештините на корисник. Перформансите се важни. |
| | 129 | 3. Иницијалното време за извршување на погледот е 103ms. Ова е прифатливо време. |
| | 130 | {{{ |
| | 131 | SELECT * FROM v_user_skills WHERE user_id = 2676094; |
| | 132 | }}} |
| | 133 | 4. Execution планот покажува дека сите операции се брзи — Index Scan и Seq Scan на мала табела Skill. Времето изминато во извршување на операциите INSERT и UPDATE изнесува: |
| | 134 | {{{ |
| | 135 | INSERT INTO Skill(skill_name, type) VALUES('TestSkill111', '!TestType'); -- 799ms |
| | 136 | UPDATE Skill SET type = '!UpdatedType' WHERE skill_name = 'TestSkill111'; -- 235ms |
| | 137 | }}} |
| | 138 | 5. Нема потреба да се преуреди прашалникот. |
| | 139 | 6. Времето на извршување на операциите останува исто. |
| | 140 | |
| | 141 | ---- |
| | 142 | |
| | 143 | == View 8: v_startups_with_founders == |
| | 144 | |
| | 145 | 1. Примарен филтер за погледот v_startups_with_founders ќе биде според startup_id. |
| | 146 | 2. Погледот се користи за преглед на стартапи и нивните основачи. Перформансите се важни. |
| | 147 | 3. Иницијалното време за извршување на погледот е 1.737s. |
| | 148 | {{{ |
| | 149 | SELECT * FROM v_startups_with_founders WHERE startup_id = 1; |
| | 150 | }}} |
| | 151 | Ова не е прифатливо време па затоа пристапуваме кон индексирање. |
| | 152 | 4. Најбавната операција е Parallel Index Scan на User табелата (1909ms) при Merge Join со 464778 редови. Времето изминато во извршување на операциите INSERT и UPDATE пред индексирање изнесува: |
| | 153 | {{{ |
| | 154 | INSERT INTO "User"(first_name, last_name, email) VALUES('Test8', 'User8', 'testuser888x@test.com'); -- 51ms |
| | 155 | UPDATE "User" SET city = 'Skopje' WHERE email = 'testuser888x@test.com'; -- 81ms |
| | 156 | }}} |
| | 157 | 5. Времето изминато во извршување на query-то со индекси изнесува 205ms, и тоа е прифатливо време. |
| | 158 | {{{ |
| | 159 | CREATE INDEX idx_founder_startup_id ON Founder(startup_id); |
| | 160 | CREATE INDEX idx_founder_user_id ON Founder(user_id); |
| | 161 | SELECT * FROM v_startups_with_founders WHERE startup_id = 1; |
| | 162 | }}} |
| | 163 | Execution планот по индексирање — сите операции користат Index Only Scan. |
| | 164 | 6. Времето изминато во извршување на операциите INSERT и UPDATE по индексирање изнесува: |
| | 165 | {{{ |
| | 166 | INSERT INTO "User"(first_name, last_name, email) VALUES('Test8b', 'User8b', 'testuser888b@test.com'); -- 51ms |
| | 167 | UPDATE "User" SET city = 'Ohrid' WHERE email = 'testuser888b@test.com'; -- 81ms |
| | 168 | }}} |
| | 169 | |
| | 170 | ---- |
| | 171 | |
| | 172 | == View 9: v_students_per_program == |
| | 173 | |
| | 174 | 1. Примарен филтер за погледот v_students_per_program ќе биде според study_program_id. |
| | 175 | 2. Погледот се користи за преглед на бројот на студенти по студиска програма. Перформансите се важни. |
| | 176 | 3. Иницијалното време за извршување на погледот е 2.27s. |
| | 177 | {{{ |
| | 178 | SELECT * FROM v_students_per_program WHERE study_program_id = 1; |
| | 179 | }}} |
| | 180 | Ова не е прифатливо време па затоа пристапуваме кон индексирање. |
| | 181 | 4. Најбавната операција е Parallel Seq Scan на Studies табелата (361ms) со 13765 редови. Времето изминато во извршување на операциите INSERT и UPDATE пред индексирање изнесува: |
| | 182 | {{{ |
| | 183 | INSERT INTO !StudyProgram(program_name, degree_type, duration_years, faculty_id) VALUES('TestProgram111', 'bachelor', 4, 1); -- 443ms |
| | 184 | UPDATE !StudyProgram SET duration_years = 3 WHERE program_name = 'TestProgram111'; -- 146ms |
| | 185 | }}} |
| | 186 | 5. Времето изминато во извршување на query-то со индекс изнесува 119ms, и тоа е прифатливо време. |
| | 187 | {{{ |
| | 188 | CREATE INDEX idx_studies_program_user ON Studies(study_program_id, user_id); |
| | 189 | SELECT * FROM v_students_per_program WHERE study_program_id = 1; |
| | 190 | }}} |
| | 191 | Execution планот по индексирање — сите операции користат Index Only Scan. |
| | 192 | 6. Времето изминато во извршување на операциите INSERT и UPDATE по индексирање изнесува: |
| | 193 | {{{ |
| | 194 | INSERT INTO !StudyProgram(program_name, degree_type, duration_years, faculty_id) VALUES('TestProgram222', 'bachelor', 4, 1); -- 371ms |
| | 195 | UPDATE !StudyProgram SET duration_years = 3 WHERE program_name = 'TestProgram222'; -- 91ms |
| | 196 | }}} |