| 61 | |
| 62 | |
| 63 | === 3. Статистика за топ 3 најдобри институции во изминатите години |
| 64 | Кверито кое успорува со многу податоци е следното: |
| 65 | {{{ |
| 66 | -- EXPLAIN (ANALYZE, BUFFERS) |
| 67 | WITH 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 | ) |
| 76 | SELECT i.name, a.total_reports |
| 77 | FROM top_3_institutions a |
| 78 | JOIN institution i ON i.institution_id = a.institution_id |
| 79 | ORDER 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), со цел да спречи скенирање на целата табела, туку само последната година. |
| 89 | CREATE INDEX IF NOT EXISTS ix_report_created_at ON report(created_at); |
| 90 | |
| 91 | -- Овој индекс ја забрзува join операцијата меѓу academicreport и report, бидејќи пребарувањето по report_id станува директно преку индекс. |
| 92 | CREATE INDEX IF NOT EXISTS ix_ar_report_id ON academicreport(report_id); |
| 93 | |
| 94 | -- Овој индекс помага при групирање и пребројување по institution_id, а исто така и при join со institution табелата. |
| 95 | CREATE INDEX IF NOT EXISTS ix_ar_institution_id ON academicreport(institution_id); |
| 96 | }}} |