| | 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 | }}} |