Changes between Version 6 and Version 7 of Indexing


Ignore:
Timestamp:
08/27/25 01:17:26 (7 days ago)
Author:
221007
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Indexing

    v6 v7  
    5959==== После индексирањето
    6060[[Image(after_indexing_2.png, align=center)]]
     61
     62
     63=== 3. Статистика за топ 3 најдобри институции во изминатите години
     64Кверито кое успорува со многу податоци е следното:
     65{{{
     66-- EXPLAIN (ANALYZE, BUFFERS)
     67WITH top_3_institutions AS (
     68  SELECT ar.institution_id, COUNT(*) AS total_reports
     69  FROM report r
     70  JOIN academicreport ar ON ar.report_id = r.report_id
     71  WHERE r.created_at >= date_trunc('year', now()) - interval '1 year'
     72  GROUP BY ar.institution_id
     73  ORDER BY COUNT(*) DESC
     74  LIMIT 3
     75)
     76SELECT i.name, a.total_reports
     77FROM top_3_institutions a
     78JOIN institution i ON i.institution_id = a.institution_id
     79ORDER BY a.total_reports DESC;
     80}}}
     81
     82Ова квери се користи во функција во апликацијата, каде функционалноста е реализирана во панелот на корисникот и се прикажува како статистика „најдобрите 3 институции во изминатата 1 година во кои се издавале академски извештаи по вкупниот број на извештаи“.
     83
     84Прво прави секвенцијални пребарувања на report, потоа на academicreport и на крај прави на institution. Со ова ги наоѓа табелите. Потоа почнува со Hash Joins (спојувања join операции) и HashAggregate (group by операции), и како за крај прави сортирање (Sort) и тоа по функција count(*) (по бројот на записи).
     85Ова би било доста спора операција во случај на многу записи низ кои треба да бара, што совршено би се решило со поставување на неколку индекси:
     86
     87{{{
     88-- Овој индекс овозможува побрзо филтрирање по датум (created_at), со цел да спречи скенирање на целата табела, туку само последната година.
     89CREATE INDEX IF NOT EXISTS ix_report_created_at          ON report(created_at);
     90
     91-- Овој индекс ја забрзува join операцијата меѓу academicreport и report, бидејќи пребарувањето по report_id станува директно преку индекс.
     92CREATE INDEX IF NOT EXISTS ix_ar_report_id               ON academicreport(report_id);
     93
     94-- Овој индекс помага при групирање и пребројување по institution_id, а исто така и при join со institution табелата.
     95CREATE INDEX IF NOT EXISTS ix_ar_institution_id          ON academicreport(institution_id);
     96}}}