Changes between Version 4 and Version 5 of otherdevelopment


Ignore:
Timestamp:
02/03/26 12:44:15 (3 days ago)
Author:
231175
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • otherdevelopment

    v4 v5  
    44
    55=== Извештај за најпопуларни курсеви според оценка ===
     6
     7Анализата на перформанси се врши врз основа на моменталната состојба во базата, која има податоци кои служат само за тестирање. Базата содржи: 1000 курсеви, 2000 преводи (по 2 преводи по курс), 1000 верзии на курсот (по 1 верзија по курс), 5000 корисници, 200 експерти, 10000 enrollments, 7000 reviews
    68
    79'''SQL:'''
     
    3436Користење: JOIN на `ct.course_id` + WHERE филтер на `ct.language` 
    3537
    36 Подобрување: Index Scan наместо Seq Scan (**~60x побрзо**)
     38Подобрување: Index Scan наместо Seq Scan
    3739
    3840---
     
    4547Користење: JOIN на `cv.course_id` 
    4648
    47 Подобрување: Директен lookup (**~45x побрзо**)
     49Подобрување: Директен lookup
    4850
    4951---
     
    5658Користење: JOIN на `e.course_version_id` 
    5759
    58 Подобрување: Избегнува full table scan (**~60x побрзо**)
     60Подобрување: Избегнува full table scan
    5961
    6062---
     
    6769Користење: JOIN на `r.enrollment_id` 
    6870
    69 Подобрување: Unique scan (**~35x побрзо**)
     71Подобрување: Unique scan
    7072
    7173---
     
    8183---
    8284
     85{{{
     86CREATE OR REPLACE FUNCTION test_popular_courses()
     87RETURNS void AS $$
     88DECLARE
     89  start_time timestamptz;
     90  end_time timestamptz;
     91  duration int;
     92BEGIN
     93  start_time := clock_timestamp();
     94 
     95  PERFORM
     96    c.id AS course_id,
     97    ct.title_short AS course_title,
     98    cv.version_number AS course_version,
     99    cv.active AS is_active,
     100    COUNT(DISTINCT e.id) AS total_enrollments,
     101    SUM(r.rating)::numeric / COUNT(r.id) AS average_rating,
     102    COUNT(r.id) AS total_reviews
     103  FROM course c
     104  JOIN course_translate ct ON c.id = ct.course_id
     105  JOIN course_version cv ON c.id = cv.course_id
     106  JOIN enrollment e ON cv.id = e.course_version_id
     107  JOIN review r ON e.id = r.enrollment_id
     108  WHERE ct.language = 'en'
     109  GROUP BY c.id, ct.id, cv.id
     110  ORDER BY SUM(r.rating)::numeric / COUNT(r.id) DESC
     111  LIMIT 20;
     112 
     113  end_time := clock_timestamp();
     114  duration := round(1000 * (extract(epoch FROM end_time) - extract(epoch FROM start_time)));
     115 
     116  RAISE NOTICE 'Query executed in: % ms', duration;
     117END;
     118$$ LANGUAGE plpgsql;
     119
     120DROP INDEX IF EXISTS uk_course_translate_course_language;
     121DROP INDEX IF EXISTS idx_course_version_course_id;
     122DROP INDEX IF EXISTS idx_enrollment_course_version_id;
     123DROP INDEX IF EXISTS uk_review_enrollment;
     124
     125-- run 1: no indexes
     126
     127SELECT test_popular_courses();
     128
     129-- run 2: index uk_course_translate_course_language
     130
     131CREATE UNIQUE INDEX uk_course_translate_course_language
     132ON course_translate(course_id, language);
     133ANALYZE course_translate;
     134
     135SELECT test_popular_courses();
     136
     137-- run 3: index uk_course_translate_course_language + idx_course_version_course_id
     138
     139CREATE INDEX idx_course_version_course_id
     140ON course_version(course_id);
     141ANALYZE course_version;
     142
     143SELECT test_popular_courses();
     144
     145-- run 4: index uk_course_translate_course_language + idx_course_version_course_id + idx_enrollment_course_version_id
     146
     147CREATE INDEX idx_enrollment_course_version_id
     148ON enrollment(course_version_id);
     149ANALYZE enrollment;
     150
     151SELECT test_popular_courses();
     152
     153-- run 5: all indexes -> uk_course_translate_course_language + idx_course_version_course_id + idx_enrollment_course_version_id + uk_review_enrollment
     154
     155CREATE UNIQUE INDEX IF NOT EXISTS uk_review_enrollment
     156ON review(enrollment_id);
     157ANALYZE review;
     158
     159SELECT test_popular_courses();
     160
     161DROP FUNCTION test_popular_courses();
     162}}}
     163
    83164**Сумарно:**
    84165- **Без индекси:** Seq Scan на сите табели (бавно)
    85166- **Со индекси:** Index Scan на сите JOIN-ови и WHERE (брзо)
    86 - **Подобрување:** **~30x побрзо**
     167- **Перформанси:**
     168 - Без индекси: 51ms
     169 - Со индекси: 23ms
     170- **Забрзување: 2.2 пати**
    87171
    88172