wiki:QueryOptimization

Фаза 3 - Индекси и оптимизација на прашалници

View 1: v_companies_by_industry

  1. Примарен филтер за погледот v_companies_by_industry ќе биде според industry_name.
  2. Погледот се користи за преглед на компании групирани по индустрија. Перформансите се важни за течно работење на апликацијата.
  3. Иницијалното време за извршување на погледот е 296ms.
    SELECT * FROM v_companies_by_industry WHERE industry_name = 'Information Technology';
    
  4. Execution планот покажува Seq Scan на Industry табелата, но времето е мало (0.025ms) бидејќи табелата е мала. Нема потреба од индекс. Времето изминато во извршување на операциите INSERT и UPDATE изнесува:
    INSERT INTO Industry(industry_name, sector_category) VALUES('!TestIndustryAAA', '!TestSector');  -- 79ms
    UPDATE Industry SET sector_category = '!UpdatedSector' WHERE industry_name = '!TestIndustryAAA';  -- 64ms
    
  5. Нема потреба од индексирање — сите операции во execution планот се брзи.
  6. Времето на извршување на операциите останува исто.

View 2: v_user_full_career

  1. Примарен филтер за погледот v_user_full_career ќе биде според user_id.
  2. Погледот се користи за преглед на целосната кариера на корисник (студии и вработување). Перформансите се важни.
  3. Иницијалното време за извршување на погледот е 5.356s.
    SELECT * FROM v_user_full_career WHERE user_id = 2676094;
    

Ова не е прифатливо време па затоа пристапуваме кон индексирање.

  1. Најбавните операции се Parallel Seq Scan на табелите Employment (660ms) и Studies (364ms). Времето изминато во извршување на операциите INSERT и UPDATE пред индексирање изнесува:
    INSERT INTO "User"(first_name, last_name, email) VALUES('Test', 'User', 'testuser111@test.com');  -- 465ms
    UPDATE "User" SET city = 'Skopje' WHERE email = 'testuser111@test.com';  -- 345ms
    
  2. Времето изминато во извршување на query-то со индекси изнесува 55ms, и тоа е прифатливо време.
    CREATE INDEX idx_employment_user_id ON Employment(user_id DESC NULLS LAST);
    CREATE INDEX idx_studies_user_id ON Studies(user_id DESC NULLS LAST);
    SELECT * FROM v_user_full_career WHERE user_id = 2676094;
    

Execution планот по индексирање — сите операции користат Index Scan.

  1. Времето изминато во извршување на операциите INSERT и UPDATE по индексирање изнесува:
    INSERT INTO "User"(first_name, last_name, email) VALUES('Test2', 'User2', 'testuser222@test.com');  -- 619ms
    UPDATE "User" SET city = 'Kicevo' WHERE email = 'testuser222@test.com';  -- 289ms
    

View 3: v_student_academic_profile

  1. Примарен филтер за погледот v_student_academic_profile ќе биде според user_id.
  2. Погледот се користи за преглед на академскиот профил на студент. Перформансите се важни.
  3. Иницијалното време за извршување на погледот е 51ms. Ова е прифатливо време.
    SELECT * FROM v_student_academic_profile WHERE user_id = 2676094;
    
  4. Execution планот покажува дека сите операции се брзи благодарение на веќе постојните индекси. Времето изминато во извршување на операциите INSERT и UPDATE изнесува:
    INSERT INTO "User"(first_name, last_name, email) VALUES('Test3', 'User3', 'testuser333@test.com');  -- 466ms
    UPDATE "User" SET city = 'Ohrid' WHERE email = 'testuser333@test.com';  -- 50ms
    
  5. Нема потреба да се преуреди прашалникот.
  6. Времето на извршување на операциите останува исто.

View 4: v_event_participants

  1. Примарен филтер за погледот v_event_participants ќе биде според event_id.
  2. Погледот се користи за преглед на учесници на настан. Перформансите се важни.
  3. Иницијалното време за извршување на погледот е 318ms.
    SELECT * FROM v_event_participants WHERE event_id = 1;
    
  4. Execution планот покажува дека сите операции користат Index Scan — нема бавни операции. Времето изминато во извршување на операциите INSERT и UPDATE изнесува:
    INSERT INTO Event(name, date, location, company_id) VALUES('TestEvent111', '2026-01-01', 'Skopje', 1);  -- 1.389s
    UPDATE Event SET location = 'Berovo' WHERE name = 'TestEvent111';  -- 389ms
    
  5. Нема потреба да се преуреди прашалникот.
  6. Времето на извршување на операциите останува исто.

View 5: v_faculty_programs

  1. Примарен филтер за погледот v_faculty_programs ќе биде според faculty_id.
  2. Погледот се користи за преглед на студиски програми по факултет. Перформансите се важни.
  3. Иницијалното време за извршување на погледот е 206ms. Ова е прифатливо време.
    SELECT * FROM v_faculty_programs WHERE faculty_id = 1;
    
  4. Execution планот покажува Seq Scan на мали табели (University, Faculty, StudyProgram) — нема потреба од индекс. Времето изминато во извршување на операциите INSERT и UPDATE изнесува:
    INSERT INTO Faculty(name, university_id) VALUES('TestFaculty111', 1);  -- 310ms
    UPDATE Faculty SET address = 'Test Address' WHERE name = 'TestFaculty111';  -- 187ms
    
  5. Нема потреба да се преуреди прашалникот.
  6. Времето на извршување на операциите останува исто.

View 6: v_employment_history

  1. Примарен филтер за погледот v_employment_history ќе биде според user_id.
  2. Погледот се користи за преглед на историјата на вработување на корисник. Перформансите се важни.
  3. Иницијалното време за извршување на погледот е 96ms. Ова е прифатливо време.
    SELECT * FROM v_employment_history WHERE user_id = 2676094;
    
  4. Execution планот покажува дека сите операции користат Index Scan благодарение на индексите додадени во View 2. Времето изминато во извршување на операциите INSERT и UPDATE изнесува:
    INSERT INTO "User"(first_name, last_name, email) VALUES('Test4', 'User4', 'testuser444@test.com');  -- 207ms
    UPDATE "User" SET city = 'Stip' WHERE email = 'testuser444@test.com';  -- 357ms
    
  5. Нема потреба да се преуреди прашалникот.
  6. Времето на извршување на операциите останува исто.

View 7: v_user_skills

  1. Примарен филтер за погледот v_user_skills ќе биде според user_id.
  2. Погледот се користи за преглед на вештините на корисник. Перформансите се важни.
  3. Иницијалното време за извршување на погледот е 103ms. Ова е прифатливо време.
    SELECT * FROM v_user_skills WHERE user_id = 2676094;
    
  4. Execution планот покажува дека сите операции се брзи — Index Scan и Seq Scan на мала табела Skill. Времето изминато во извршување на операциите INSERT и UPDATE изнесува:
    INSERT INTO Skill(skill_name, type) VALUES('TestSkill111', '!TestType');  -- 799ms
    UPDATE Skill SET type = '!UpdatedType' WHERE skill_name = 'TestSkill111';  -- 235ms
    
  5. Нема потреба да се преуреди прашалникот.
  6. Времето на извршување на операциите останува исто.

View 8: v_startups_with_founders

  1. Примарен филтер за погледот v_startups_with_founders ќе биде според startup_id.
  2. Погледот се користи за преглед на стартапи и нивните основачи. Перформансите се важни.
  3. Иницијалното време за извршување на погледот е 1.737s.
    SELECT * FROM v_startups_with_founders WHERE startup_id = 1;
    

Ова не е прифатливо време па затоа пристапуваме кон индексирање.

  1. Најбавната операција е Parallel Index Scan на User табелата (1909ms) при Merge Join со 464778 редови. Времето изминато во извршување на операциите INSERT и UPDATE пред индексирање изнесува:
    INSERT INTO "User"(first_name, last_name, email) VALUES('Test8', 'User8', 'testuser888x@test.com');  -- 51ms
    UPDATE "User" SET city = 'Skopje' WHERE email = 'testuser888x@test.com';  -- 81ms
    
  2. Времето изминато во извршување на query-то со индекси изнесува 205ms, и тоа е прифатливо време.
    CREATE INDEX idx_founder_startup_id ON Founder(startup_id);
    CREATE INDEX idx_founder_user_id ON Founder(user_id);
    SELECT * FROM v_startups_with_founders WHERE startup_id = 1;
    

Execution планот по индексирање — сите операции користат Index Only Scan.

  1. Времето изминато во извршување на операциите INSERT и UPDATE по индексирање изнесува:
    INSERT INTO "User"(first_name, last_name, email) VALUES('Test8b', 'User8b', 'testuser888b@test.com');  -- 51ms
    UPDATE "User" SET city = 'Ohrid' WHERE email = 'testuser888b@test.com';  -- 81ms
    

View 9: v_students_per_program

  1. Примарен филтер за погледот v_students_per_program ќе биде според study_program_id.
  2. Погледот се користи за преглед на бројот на студенти по студиска програма. Перформансите се важни.
  3. Иницијалното време за извршување на погледот е 2.27s.
    SELECT * FROM v_students_per_program WHERE study_program_id = 1;
    

Ова не е прифатливо време па затоа пристапуваме кон индексирање.

  1. Најбавната операција е Parallel Seq Scan на Studies табелата (361ms) со 13765 редови. Времето изминато во извршување на операциите INSERT и UPDATE пред индексирање изнесува:
    INSERT INTO !StudyProgram(program_name, degree_type, duration_years, faculty_id) VALUES('TestProgram111', 'bachelor', 4, 1);  -- 443ms
    UPDATE !StudyProgram SET duration_years = 3 WHERE program_name = 'TestProgram111';  -- 146ms
    
  2. Времето изминато во извршување на query-то со индекс изнесува 119ms, и тоа е прифатливо време.
    CREATE INDEX idx_studies_program_user ON Studies(study_program_id, user_id);
    SELECT * FROM v_students_per_program WHERE study_program_id = 1;
    

Execution планот по индексирање — сите операции користат Index Only Scan.

  1. Времето изминато во извршување на операциите INSERT и UPDATE по индексирање изнесува:
    INSERT INTO !StudyProgram(program_name, degree_type, duration_years, faculty_id) VALUES('TestProgram222', 'bachelor', 4, 1);  -- 371ms
    UPDATE !StudyProgram SET duration_years = 3 WHERE program_name = 'TestProgram222';  -- 91ms
    
Last modified 7 days ago Last modified on 05/19/26 01:01:38
Note: See TracWiki for help on using the wiki.