[SQL] Person statistics in "My students" take very long #150

Closed
opened 2021-03-18 09:09:42 +01:00 by hansegucker · 13 comments
Owner
SELECT DISTINCT "core_person"."id",
       "core_person"."site_id",
       "core_person"."extended_data",
       "core_person"."user_id",
       "core_person"."is_active",
       "core_person"."first_name",
       "core_person"."last_name",
       "core_person"."additional_name",
       "core_person"."short_name",
       "core_person"."street",
       "core_person"."housenumber",
       "core_person"."postal_code",
       "core_person"."place",
       "core_person"."phone_number",
       "core_person"."mobile_number",
       "core_person"."email",
       "core_person"."date_of_birth",
       "core_person"."sex",
       "core_person"."photo",
       "core_person"."primary_group_id",
       "core_person"."description",
       COUNT(DISTINCT T8."id") FILTER (WHERE (T8."absent" AND ("chronos_validityrange"."school_term_id" = 2 OR "chronos_extralesson"."school_term_id" = 2 OR "chronos_event"."school_term_id" = 2) AND ("chronos_lesson_groups"."group_id" = ... OR "core_group_parent_groups"."to_group_id" = ... OR "chronos_extralesson_groups"."group_id" = ... OR T23."to_group_id" = ... OR "chronos_event_groups"."group_id" = ... OR T27."to_group_id" = ...))) AS "absences_count",
       COUNT(DISTINCT T8."id") FILTER (WHERE (T8."absent" AND T8."excuse_type_id" IS NULL AND T8."excused" AND ("chronos_validityrange"."school_term_id" = 2 OR "chronos_extralesson"."school_term_id" = 2 OR "chronos_event"."school_term_id" = 2) AND ("chronos_lesson_groups"."group_id" = ... OR "core_group_parent_groups"."to_group_id" = ... OR "chronos_extralesson_groups"."group_id" = ... OR T23."to_group_id" = ... OR "chronos_event_groups"."group_id" = ... OR T27."to_group_id" = ...))) AS "excused",
       COUNT(DISTINCT T8."id") FILTER (WHERE (T8."absent" AND NOT T8."excused" AND ("chronos_validityrange"."school_term_id" = 2 OR "chronos_extralesson"."school_term_id" = 2 OR "chronos_event"."school_term_id" = 2) AND ("chronos_lesson_groups"."group_id" = ... OR "core_group_parent_groups"."to_group_id" = ... OR "chronos_extralesson_groups"."group_id" = ... OR T23."to_group_id" = ... OR "chronos_event_groups"."group_id" = ... OR T27."to_group_id" = ...))) AS "unexcused",
       (
        SELECT DISTINCT SUM(U2."late") AS "tardiness"
          FROM "core_person" U0
         INNER JOIN "alsijil_personalnote" U2
            ON (U0."id" = U2."person_id")
          LEFT OUTER JOIN "chronos_lessonperiod" U3
            ON (U2."lesson_period_id" = U3."id")
          LEFT OUTER JOIN "chronos_lesson" U4
            ON (U3."lesson_id" = U4."id")
          LEFT OUTER JOIN "chronos_validityrange" U5
            ON (U4."validity_id" = U5."id")
          LEFT OUTER JOIN "chronos_extralesson" U7
            ON (U2."extra_lesson_id" = U7."id")
          LEFT OUTER JOIN "chronos_event" U9
            ON (U2."event_id" = U9."id")
          LEFT OUTER JOIN "chronos_lesson_groups" U11
            ON (U4."id" = U11."lesson_id")
          LEFT OUTER JOIN "core_group" U12
            ON (U11."group_id" = U12."id")
          LEFT OUTER JOIN "core_group_parent_groups" U13
            ON (U12."id" = U13."from_group_id")
          LEFT OUTER JOIN "chronos_extralesson_groups" U15
            ON (U7."id" = U15."extralesson_id")
          LEFT OUTER JOIN "core_group" U16
            ON (U15."group_id" = U16."id")
          LEFT OUTER JOIN "core_group_parent_groups" U17
            ON (U16."id" = U17."from_group_id")
          LEFT OUTER JOIN "chronos_event_groups" U19
            ON (U9."id" = U19."event_id")
          LEFT OUTER JOIN "core_group" U20
            ON (U19."group_id" = U20."id")
          LEFT OUTER JOIN "core_group_parent_groups" U21
            ON (U20."id" = U21."from_group_id")
         WHERE (U0."site_id" = 1 AND (U5."school_term_id" = 2 OR U7."school_term_id" = 2 OR U9."school_term_id" = 2) AND (U11."group_id" = ... OR U13."to_group_id" = ... OR U15."group_id" = ... OR U17."to_group_id" = ... OR U19."group_id" = ... OR U21."to_group_id" = ...) AND U0."id" = "core_person"."id")
         GROUP BY U0."id"
       ) AS "tardiness",
       COUNT(DISTINCT T8."id") FILTER (WHERE (NOT (T8."late" = 0 AND T8."late" IS NOT NULL) AND ("chronos_validityrange"."school_term_id" = 2 OR "chronos_extralesson"."school_term_id" = 2 OR "chronos_event"."school_term_id" = 2) AND ("chronos_lesson_groups"."group_id" = ... OR "core_group_parent_groups"."to_group_id" = ... OR "chronos_extralesson_groups"."group_id" = ... OR T23."to_group_id" = ... OR "chronos_event_groups"."group_id" = ... OR T27."to_group_id" = ...))) AS "tardiness_count",
       COUNT(DISTINCT T8."id") FILTER (WHERE ("alsijil_personalnote_extra_marks"."extramark_id" = 1 AND ("chronos_validityrange"."school_term_id" = 2 OR "chronos_extralesson"."school_term_id" = 2 OR "chronos_event"."school_term_id" = 2) AND ("chronos_lesson_groups"."group_id" = ... OR "core_group_parent_groups"."to_group_id" = ... OR "chronos_extralesson_groups"."group_id" = ... OR T23."to_group_id" = ... OR "chronos_event_groups"."group_id" = ... OR T27."to_group_id" = ...))) AS "HA_count",
       COUNT(DISTINCT T8."absent") FILTER (WHERE (T8."absent" AND T8."excuse_type_id" = 1 AND ("chronos_validityrange"."school_term_id" = 2 OR "chronos_extralesson"."school_term_id" = 2 OR "chronos_event"."school_term_id" = 2) AND ("chronos_lesson_groups"."group_id" = ... OR "core_group_parent_groups"."to_group_id" = ... OR "chronos_extralesson_groups"."group_id" = ... OR T23."to_group_id" = ... OR "chronos_event_groups"."group_id" = ... OR T27."to_group_id" = ...))) AS "s_count"
  FROM "core_person"
 INNER JOIN "core_persongroupthrough"
    ON ("core_person"."id" = "core_persongroupthrough"."person_id")
 INNER JOIN "alsijil_personalnote"
    ON ("core_person"."id" = "alsijil_personalnote"."person_id")
 INNER JOIN "alsijil_personalnote_groups_of_person"
    ON ("alsijil_personalnote"."id" = "alsijil_personalnote_groups_of_person"."personalnote_id")
  LEFT OUTER JOIN "alsijil_personalnote" T8
    ON ("core_person"."id" = T8."person_id")
  LEFT OUTER JOIN "chronos_lessonperiod"
    ON (T8."lesson_period_id" = "chronos_lessonperiod"."id")
  LEFT OUTER JOIN "chronos_lesson"
    ON ("chronos_lessonperiod"."lesson_id" = "chronos_lesson"."id")
  LEFT OUTER JOIN "chronos_validityrange"
    ON ("chronos_lesson"."validity_id" = "chronos_validityrange"."id")
  LEFT OUTER JOIN "chronos_extralesson"
    ON (T8."extra_lesson_id" = "chronos_extralesson"."id")
  LEFT OUTER JOIN "chronos_event"
    ON (T8."event_id" = "chronos_event"."id")
  LEFT OUTER JOIN "chronos_lesson_groups"
    ON ("chronos_lesson"."id" = "chronos_lesson_groups"."lesson_id")
  LEFT OUTER JOIN "core_group" T18
    ON ("chronos_lesson_groups"."group_id" = T18."id")
  LEFT OUTER JOIN "core_group_parent_groups"
    ON (T18."id" = "core_group_parent_groups"."from_group_id")
  LEFT OUTER JOIN "chronos_extralesson_groups"
    ON ("chronos_extralesson"."id" = "chronos_extralesson_groups"."extralesson_id")
  LEFT OUTER JOIN "core_group" T22
    ON ("chronos_extralesson_groups"."group_id" = T22."id")
  LEFT OUTER JOIN "core_group_parent_groups" T23
    ON (T22."id" = T23."from_group_id")
  LEFT OUTER JOIN "chronos_event_groups"
    ON ("chronos_event"."id" = "chronos_event_groups"."event_id")
  LEFT OUTER JOIN "core_group" T26
    ON ("chronos_event_groups"."group_id" = T26."id")
  LEFT OUTER JOIN "core_group_parent_groups" T27
    ON (T26."id" = T27."from_group_id")
  LEFT OUTER JOIN "alsijil_personalnote_extra_marks"
    ON (T8."id" = "alsijil_personalnote_extra_marks"."personalnote_id")
 WHERE ("core_person"."site_id" = 1 AND "core_persongroupthrough"."group_id" = ... AND "alsijil_personalnote_groups_of_person"."group_id" = ... AND ("chronos_validityrange"."school_term_id" = 2 OR "chronos_extralesson"."school_term_id" = 2 OR "chronos_event"."school_term_id" = 2))
 GROUP BY "core_person"."id"

This query takes 18020 ms (example in production).

```sql SELECT DISTINCT "core_person"."id", "core_person"."site_id", "core_person"."extended_data", "core_person"."user_id", "core_person"."is_active", "core_person"."first_name", "core_person"."last_name", "core_person"."additional_name", "core_person"."short_name", "core_person"."street", "core_person"."housenumber", "core_person"."postal_code", "core_person"."place", "core_person"."phone_number", "core_person"."mobile_number", "core_person"."email", "core_person"."date_of_birth", "core_person"."sex", "core_person"."photo", "core_person"."primary_group_id", "core_person"."description", COUNT(DISTINCT T8."id") FILTER (WHERE (T8."absent" AND ("chronos_validityrange"."school_term_id" = 2 OR "chronos_extralesson"."school_term_id" = 2 OR "chronos_event"."school_term_id" = 2) AND ("chronos_lesson_groups"."group_id" = ... OR "core_group_parent_groups"."to_group_id" = ... OR "chronos_extralesson_groups"."group_id" = ... OR T23."to_group_id" = ... OR "chronos_event_groups"."group_id" = ... OR T27."to_group_id" = ...))) AS "absences_count", COUNT(DISTINCT T8."id") FILTER (WHERE (T8."absent" AND T8."excuse_type_id" IS NULL AND T8."excused" AND ("chronos_validityrange"."school_term_id" = 2 OR "chronos_extralesson"."school_term_id" = 2 OR "chronos_event"."school_term_id" = 2) AND ("chronos_lesson_groups"."group_id" = ... OR "core_group_parent_groups"."to_group_id" = ... OR "chronos_extralesson_groups"."group_id" = ... OR T23."to_group_id" = ... OR "chronos_event_groups"."group_id" = ... OR T27."to_group_id" = ...))) AS "excused", COUNT(DISTINCT T8."id") FILTER (WHERE (T8."absent" AND NOT T8."excused" AND ("chronos_validityrange"."school_term_id" = 2 OR "chronos_extralesson"."school_term_id" = 2 OR "chronos_event"."school_term_id" = 2) AND ("chronos_lesson_groups"."group_id" = ... OR "core_group_parent_groups"."to_group_id" = ... OR "chronos_extralesson_groups"."group_id" = ... OR T23."to_group_id" = ... OR "chronos_event_groups"."group_id" = ... OR T27."to_group_id" = ...))) AS "unexcused", ( SELECT DISTINCT SUM(U2."late") AS "tardiness" FROM "core_person" U0 INNER JOIN "alsijil_personalnote" U2 ON (U0."id" = U2."person_id") LEFT OUTER JOIN "chronos_lessonperiod" U3 ON (U2."lesson_period_id" = U3."id") LEFT OUTER JOIN "chronos_lesson" U4 ON (U3."lesson_id" = U4."id") LEFT OUTER JOIN "chronos_validityrange" U5 ON (U4."validity_id" = U5."id") LEFT OUTER JOIN "chronos_extralesson" U7 ON (U2."extra_lesson_id" = U7."id") LEFT OUTER JOIN "chronos_event" U9 ON (U2."event_id" = U9."id") LEFT OUTER JOIN "chronos_lesson_groups" U11 ON (U4."id" = U11."lesson_id") LEFT OUTER JOIN "core_group" U12 ON (U11."group_id" = U12."id") LEFT OUTER JOIN "core_group_parent_groups" U13 ON (U12."id" = U13."from_group_id") LEFT OUTER JOIN "chronos_extralesson_groups" U15 ON (U7."id" = U15."extralesson_id") LEFT OUTER JOIN "core_group" U16 ON (U15."group_id" = U16."id") LEFT OUTER JOIN "core_group_parent_groups" U17 ON (U16."id" = U17."from_group_id") LEFT OUTER JOIN "chronos_event_groups" U19 ON (U9."id" = U19."event_id") LEFT OUTER JOIN "core_group" U20 ON (U19."group_id" = U20."id") LEFT OUTER JOIN "core_group_parent_groups" U21 ON (U20."id" = U21."from_group_id") WHERE (U0."site_id" = 1 AND (U5."school_term_id" = 2 OR U7."school_term_id" = 2 OR U9."school_term_id" = 2) AND (U11."group_id" = ... OR U13."to_group_id" = ... OR U15."group_id" = ... OR U17."to_group_id" = ... OR U19."group_id" = ... OR U21."to_group_id" = ...) AND U0."id" = "core_person"."id") GROUP BY U0."id" ) AS "tardiness", COUNT(DISTINCT T8."id") FILTER (WHERE (NOT (T8."late" = 0 AND T8."late" IS NOT NULL) AND ("chronos_validityrange"."school_term_id" = 2 OR "chronos_extralesson"."school_term_id" = 2 OR "chronos_event"."school_term_id" = 2) AND ("chronos_lesson_groups"."group_id" = ... OR "core_group_parent_groups"."to_group_id" = ... OR "chronos_extralesson_groups"."group_id" = ... OR T23."to_group_id" = ... OR "chronos_event_groups"."group_id" = ... OR T27."to_group_id" = ...))) AS "tardiness_count", COUNT(DISTINCT T8."id") FILTER (WHERE ("alsijil_personalnote_extra_marks"."extramark_id" = 1 AND ("chronos_validityrange"."school_term_id" = 2 OR "chronos_extralesson"."school_term_id" = 2 OR "chronos_event"."school_term_id" = 2) AND ("chronos_lesson_groups"."group_id" = ... OR "core_group_parent_groups"."to_group_id" = ... OR "chronos_extralesson_groups"."group_id" = ... OR T23."to_group_id" = ... OR "chronos_event_groups"."group_id" = ... OR T27."to_group_id" = ...))) AS "HA_count", COUNT(DISTINCT T8."absent") FILTER (WHERE (T8."absent" AND T8."excuse_type_id" = 1 AND ("chronos_validityrange"."school_term_id" = 2 OR "chronos_extralesson"."school_term_id" = 2 OR "chronos_event"."school_term_id" = 2) AND ("chronos_lesson_groups"."group_id" = ... OR "core_group_parent_groups"."to_group_id" = ... OR "chronos_extralesson_groups"."group_id" = ... OR T23."to_group_id" = ... OR "chronos_event_groups"."group_id" = ... OR T27."to_group_id" = ...))) AS "s_count" FROM "core_person" INNER JOIN "core_persongroupthrough" ON ("core_person"."id" = "core_persongroupthrough"."person_id") INNER JOIN "alsijil_personalnote" ON ("core_person"."id" = "alsijil_personalnote"."person_id") INNER JOIN "alsijil_personalnote_groups_of_person" ON ("alsijil_personalnote"."id" = "alsijil_personalnote_groups_of_person"."personalnote_id") LEFT OUTER JOIN "alsijil_personalnote" T8 ON ("core_person"."id" = T8."person_id") LEFT OUTER JOIN "chronos_lessonperiod" ON (T8."lesson_period_id" = "chronos_lessonperiod"."id") LEFT OUTER JOIN "chronos_lesson" ON ("chronos_lessonperiod"."lesson_id" = "chronos_lesson"."id") LEFT OUTER JOIN "chronos_validityrange" ON ("chronos_lesson"."validity_id" = "chronos_validityrange"."id") LEFT OUTER JOIN "chronos_extralesson" ON (T8."extra_lesson_id" = "chronos_extralesson"."id") LEFT OUTER JOIN "chronos_event" ON (T8."event_id" = "chronos_event"."id") LEFT OUTER JOIN "chronos_lesson_groups" ON ("chronos_lesson"."id" = "chronos_lesson_groups"."lesson_id") LEFT OUTER JOIN "core_group" T18 ON ("chronos_lesson_groups"."group_id" = T18."id") LEFT OUTER JOIN "core_group_parent_groups" ON (T18."id" = "core_group_parent_groups"."from_group_id") LEFT OUTER JOIN "chronos_extralesson_groups" ON ("chronos_extralesson"."id" = "chronos_extralesson_groups"."extralesson_id") LEFT OUTER JOIN "core_group" T22 ON ("chronos_extralesson_groups"."group_id" = T22."id") LEFT OUTER JOIN "core_group_parent_groups" T23 ON (T22."id" = T23."from_group_id") LEFT OUTER JOIN "chronos_event_groups" ON ("chronos_event"."id" = "chronos_event_groups"."event_id") LEFT OUTER JOIN "core_group" T26 ON ("chronos_event_groups"."group_id" = T26."id") LEFT OUTER JOIN "core_group_parent_groups" T27 ON (T26."id" = T27."from_group_id") LEFT OUTER JOIN "alsijil_personalnote_extra_marks" ON (T8."id" = "alsijil_personalnote_extra_marks"."personalnote_id") WHERE ("core_person"."site_id" = 1 AND "core_persongroupthrough"."group_id" = ... AND "alsijil_personalnote_groups_of_person"."group_id" = ... AND ("chronos_validityrange"."school_term_id" = 2 OR "chronos_extralesson"."school_term_id" = 2 OR "chronos_event"."school_term_id" = 2)) GROUP BY "core_person"."id" ``` This query takes **18020 ms** (example in production).
Owner

changed the description

changed the description
Owner

Example plan form production:

 Unique  (cost=8046541.85..8046717.27 rows=2506 width=210) (actual time=25504.349..25504.471 rows=26 loops=1)
   Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND (t8.excuse_type_id IS NULL) AND t8.excused AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND (NOT t8.excused) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), ((SubPlan 1)), (count(DISTINCT t8.id) FILTER (WHERE (((t8.late <> 0) OR (t8.late IS NULL)) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE ((alsijil_personalnote_extra_marks.extramark_id = 1) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.absent) FILTER (WHERE (t8.absent AND (t8.excuse_type_id = 1) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856)))))
   Buffers: shared hit=18990721 read=111
   ->  Sort  (cost=8046541.85..8046548.12 rows=2506 width=210) (actual time=25504.348..25504.396 rows=26 loops=1)
         Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND (t8.excuse_type_id IS NULL) AND t8.excused AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND (NOT t8.excused) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), ((SubPlan 1)), (count(DISTINCT t8.id) FILTER (WHERE (((t8.late <> 0) OR (t8.late IS NULL)) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE ((alsijil_personalnote_extra_marks.extramark_id = 1) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.absent) FILTER (WHERE (t8.absent AND (t8.excuse_type_id = 1) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856)))))
         Sort Key: core_person.id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND (t8.excuse_type_id IS NULL) AND t8.excused AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND (NOT t8.excused) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), ((SubPlan 1)), (count(DISTINCT t8.id) FILTER (WHERE (((t8.late <> 0) OR (t8.late IS NULL)) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE ((alsijil_personalnote_extra_marks.extramark_id = 1) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.absent) FILTER (WHERE (t8.absent AND (t8.excuse_type_id = 1) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856)))))
         Sort Method: quicksort  Memory: 38kB
         Buffers: shared hit=18990721 read=111
         ->  GroupAggregate  (cost=48.63..8046400.38 rows=2506 width=210) (actual time=2946.403..25504.119 rows=26 loops=1)
               Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856)))), count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND (t8.excuse_type_id IS NULL) AND t8.excused AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856)))), count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND (NOT t8.excused) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856)))), (SubPlan 1), count(DISTINCT t8.id) FILTER (WHERE (((t8.late <> 0) OR (t8.late IS NULL)) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856)))), count(DISTINCT t8.id) FILTER (WHERE ((alsijil_personalnote_extra_marks.extramark_id = 1) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856)))), count(DISTINCT t8.absent) FILTER (WHERE (t8.absent AND (t8.excuse_type_id = 1) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))
               Group Key: core_person.id
               Buffers: shared hit=18990702 read=111
               ->  Nested Loop Left Join  (cost=48.63..56111.28 rows=88412 width=206) (actual time=2158.051..25261.753 rows=492384 loops=1)
                     Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, chronos_validityrange.school_term_id, chronos_extralesson.school_term_id, chronos_event.school_term_id, chronos_lesson_groups.group_id, core_group_parent_groups.to_group_id, chronos_extralesson_groups.group_id, t23.to_group_id, chronos_event_groups.group_id, t27.to_group_id, t8.excuse_type_id, t8.excused, t8.late, alsijil_personalnote_extra_marks.extramark_id
                     Buffers: shared hit=18907006 read=109
                     ->  Nested Loop Left Join  (cost=48.35..42780.70 rows=30892 width=206) (actual time=2158.034..24953.786 rows=492384 loops=1)
                           Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, chronos_validityrange.school_term_id, chronos_extralesson.school_term_id, chronos_event.school_term_id, chronos_lesson_groups.group_id, core_group_parent_groups.to_group_id, chronos_extralesson_groups.group_id, t22.id, chronos_event_groups.group_id, t27.to_group_id, alsijil_personalnote_extra_marks.extramark_id
                           Join Filter: (chronos_event.id = chronos_event_groups.event_id)
                           Rows Removed by Join Filter: 8370528
                           Buffers: shared hit=18907006 read=109
                           ->  Nested Loop Left Join  (cost=47.79..35746.41 rows=10794 width=202) (actual time=2157.765..23509.580 rows=492384 loops=1)
                                 Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, chronos_validityrange.school_term_id, chronos_extralesson.school_term_id, chronos_event.school_term_id, chronos_event.id, chronos_lesson_groups.group_id, core_group_parent_groups.to_group_id, chronos_extralesson_groups.group_id, t22.id, alsijil_personalnote_extra_marks.extramark_id
                                 Buffers: shared hit=18906930 read=108
                                 ->  Nested Loop Left Join  (cost=47.51..32425.59 rows=10794 width=198) (actual time=2157.741..22588.217 rows=492384 loops=1)
                                       Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, chronos_validityrange.school_term_id, chronos_extralesson.school_term_id, chronos_event.school_term_id, chronos_event.id, chronos_lesson_groups.group_id, core_group_parent_groups.to_group_id, chronos_extralesson_groups.group_id, t22.id
                                       Buffers: shared hit=17912031 read=108
                                       ->  Nested Loop Left Join  (cost=47.23..30797.89 rows=3772 width=198) (actual time=2157.706..21644.067 rows=492384 loops=1)
                                             Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, chronos_validityrange.school_term_id, chronos_extralesson.school_term_id, chronos_event.school_term_id, chronos_event.id, chronos_lesson_groups.group_id, t18.id, chronos_extralesson_groups.group_id, t22.id
                                             Buffers: shared hit=16927262 read=108
                                             ->  Nested Loop Left Join  (cost=46.81..25442.06 rows=3370 width=194) (actual time=2157.689..21231.304 rows=492384 loops=1)
                                                   Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, chronos_validityrange.school_term_id, chronos_extralesson.school_term_id, chronos_extralesson.id, chronos_event.school_term_id, chronos_event.id, chronos_lesson_groups.group_id, t18.id
                                                   Inner Unique: true
                                                   Buffers: shared hit=16927262 read=108
                                                   ->  Nested Loop Left Join  (cost=46.53..24230.45 rows=3370 width=190) (actual time=2157.670..20145.244 rows=492384 loops=1)
                                                         Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, chronos_validityrange.school_term_id, chronos_extralesson.school_term_id, chronos_extralesson.id, chronos_event.school_term_id, chronos_event.id, chronos_lesson_groups.group_id
                                                         Buffers: shared hit=15450109 read=108
                                                         ->  Nested Loop Left Join  (cost=46.25..23088.71 rows=3370 width=190) (actual time=2157.641..18925.858 rows=492384 loops=1)
                                                               Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, chronos_lesson.id, chronos_validityrange.school_term_id, chronos_extralesson.school_term_id, chronos_extralesson.id, chronos_event.school_term_id, chronos_event.id
                                                               Inner Unique: true
                                                               Filter: ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2))
                                                               Rows Removed by Filter: 1570997
                                                               Buffers: shared hit=13972956 read=108
                                                               ->  Nested Loop Left Join  (cost=46.10..20364.32 rows=15131 width=186) (actual time=2153.024..17933.461 rows=2063381 loops=1)
                                                                     Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, t8.extra_lesson_id, chronos_lesson.id, chronos_validityrange.school_term_id, chronos_event.school_term_id, chronos_event.id
                                                                     Inner Unique: true
                                                                     Buffers: shared hit=13972956 read=108
                                                                     ->  Nested Loop Left Join  (cost=45.96..18018.65 rows=15131 width=182) (actual time=2153.017..16666.081 rows=2063381 loops=1)
                                                                           Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, t8.extra_lesson_id, t8.event_id, chronos_lesson.id, chronos_validityrange.school_term_id
                                                                           Inner Unique: true
                                                                           Join Filter: (chronos_lesson.validity_id = chronos_validityrange.id)
                                                                           Rows Removed by Join Filter: 11196096
                                                                           Buffers: shared hit=13972956 read=108
                                                                           ->  Nested Loop Left Join  (cost=45.96..15710.09 rows=15131 width=182) (actual time=2152.993..14168.297 rows=2063381 loops=1)
                                                                                 Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, t8.extra_lesson_id, t8.event_id, chronos_lesson.id, chronos_lesson.validity_id
                                                                                 Inner Unique: true
                                                                                 Buffers: shared hit=13972955 read=108
                                                                                 ->  Nested Loop Left Join  (cost=45.68..10710.17 rows=15131 width=178) (actual time=2152.981..9830.726 rows=2063381 loops=1)
                                                                                       Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, t8.extra_lesson_id, t8.event_id, chronos_lessonperiod.lesson_id
                                                                                       Inner Unique: true
                                                                                       Buffers: shared hit=7782812 read=108
                                                                                       ->  Nested Loop Left Join  (cost=45.40..6109.06 rows=15131 width=178) (actual time=2152.959..4966.810 rows=2063381 loops=1)
                                                                                             Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, t8.lesson_period_id, t8.extra_lesson_id, t8.event_id
                                                                                             Buffers: shared hit=1592669 read=108
                                                                                             ->  Nested Loop  (cost=44.97..4210.92 rows=73 width=154) (actual time=2152.927..2278.370 rows=3667 loops=1)
                                                                                                   Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description
                                                                                                   Inner Unique: true
                                                                                                   Buffers: shared hit=55394 read=108
                                                                                                   ->  Nested Loop  (cost=44.54..968.86 rows=4767 width=158) (actual time=2147.952..2178.476 rows=14630 loops=1)
                                                                                                         Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, alsijil_personalnote.id
                                                                                                         Buffers: shared hit=11238
                                                                                                         ->  Merge Join  (cost=44.12..370.82 rows=23 width=158) (actual time=2147.928..2149.761 rows=26 loops=1)
                                                                                                               Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, core_persongroupthrough.person_id
                                                                                                               Merge Cond: (core_person.id = core_persongroupthrough.person_id)
                                                                                                               Buffers: shared hit=339
                                                                                                               ->  Index Scan using core_person_pkey on public.core_person  (cost=0.28..322.73 rows=2506 width=154) (actual time=2147.639..2149.154 rows=2177 loops=1)
                                                                                                                     Output: core_person.id, core_person.extended_data, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.description, core_person.primary_group_id, core_person.site_id, core_person.user_id
                                                                                                                     Filter: (core_person.site_id = 1)
                                                                                                                     Buffers: shared hit=317
                                                                                                               ->  Sort  (cost=43.70..43.76 rows=23 width=4) (actual time=0.174..0.221 rows=26 loops=1)
                                                                                                                     Output: core_persongroupthrough.person_id
                                                                                                                     Sort Key: core_persongroupthrough.person_id
                                                                                                                     Sort Method: quicksort  Memory: 26kB
                                                                                                                     Buffers: shared hit=22
                                                                                                                     ->  Index Scan using core_persongroupthrough_group_id_62316e93 on public.core_persongroupthrough  (cost=0.29..43.18 rows=23 width=4) (actual time=0.043..0.152 rows=26 loops=1)
                                                                                                                           Output: core_persongroupthrough.person_id
                                                                                                                           Index Cond: (core_persongroupthrough.group_id = 5856)
                                                                                                                           Buffers: shared hit=22
                                                                                                         ->  Index Scan using alsijil_personalnote_person_id_35fbe0f4 on public.alsijil_personalnote  (cost=0.42..19.86 rows=614 width=8) (actual time=0.017..0.838 rows=563 loops=26)
                                                                                                               Output: alsijil_personalnote.id, alsijil_personalnote.extended_data, alsijil_personalnote.week, alsijil_personalnote.absent, alsijil_personalnote.late, alsijil_personalnote.excused, alsijil_personalnote.remarks, alsijil_personalnote.lesson_period_id, alsijil_personalnote.person_id, alsijil_personalnote.site_id, alsijil_personalnote.excuse_type_id, alsijil_personalnote.year, alsijil_personalnote.event_id, alsijil_personalnote.extra_lesson_id
                                                                                                               Index Cond: (alsijil_personalnote.person_id = core_person.id)
                                                                                                               Buffers: shared hit=10899
                                                                                                   ->  Index Only Scan using alsijil_personalnote_gro_personalnote_id_group_id_2fbbd65b_uniq on public.alsijil_personalnote_groups_of_person  (cost=0.43..0.68 rows=1 width=4) (actual time=0.006..0.006 rows=0 loops=14630)
                                                                                                         Output: alsijil_personalnote_groups_of_person.personalnote_id, alsijil_personalnote_groups_of_person.group_id
                                                                                                         Index Cond: ((alsijil_personalnote_groups_of_person.personalnote_id = alsijil_personalnote.id) AND (alsijil_personalnote_groups_of_person.group_id = 5856))
                                                                                                         Heap Fetches: 373
                                                                                                         Buffers: shared hit=44156 read=108
                                                                                             ->  Index Scan using alsijil_personalnote_person_id_35fbe0f4 on public.alsijil_personalnote t8  (cost=0.42..19.86 rows=614 width=28) (actual time=0.009..0.604 rows=563 loops=3667)
                                                                                                   Output: t8.id, t8.extended_data, t8.week, t8.absent, t8.late, t8.excused, t8.remarks, t8.lesson_period_id, t8.person_id, t8.site_id, t8.excuse_type_id, t8.year, t8.event_id, t8.extra_lesson_id
                                                                                                   Index Cond: (t8.person_id = core_person.id)
                                                                                                   Buffers: shared hit=1537275
                                                                                       ->  Index Scan using chronos_lessonperiod_pkey on public.chronos_lessonperiod  (cost=0.29..0.30 rows=1 width=8) (actual time=0.002..0.002 rows=1 loops=2063381)
                                                                                             Output: chronos_lessonperiod.id, chronos_lessonperiod.extended_data, chronos_lessonperiod.lesson_id, chronos_lessonperiod.period_id, chronos_lessonperiod.room_id, chronos_lessonperiod.site_id
                                                                                             Index Cond: (chronos_lessonperiod.id = t8.lesson_period_id)
                                                                                             Buffers: shared hit=6190143
                                                                                 ->  Index Scan using chronos_lesson_pkey on public.chronos_lesson  (cost=0.28..0.33 rows=1 width=8) (actual time=0.002..0.002 rows=1 loops=2063381)
                                                                                       Output: chronos_lesson.id, chronos_lesson.extended_data, chronos_lesson.site_id, chronos_lesson.subject_id, chronos_lesson.validity_id
                                                                                       Index Cond: (chronos_lesson.id = chronos_lessonperiod.lesson_id)
                                                                                       Buffers: shared hit=6190143
                                                                           ->  Materialize  (cost=0.00..1.17 rows=11 width=8) (actual time=0.000..0.000 rows=6 loops=2063381)
                                                                                 Output: chronos_validityrange.school_term_id, chronos_validityrange.id
                                                                                 Buffers: shared hit=1
                                                                                 ->  Seq Scan on public.chronos_validityrange  (cost=0.00..1.11 rows=11 width=8) (actual time=0.014..0.021 rows=10 loops=1)
                                                                                       Output: chronos_validityrange.school_term_id, chronos_validityrange.id
                                                                                       Buffers: shared hit=1
                                                                     ->  Index Scan using chronos_event_pkey on public.chronos_event  (cost=0.14..0.16 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=2063381)
                                                                           Output: chronos_event.id, chronos_event.extended_data, chronos_event.title, chronos_event.date_start, chronos_event.date_end, chronos_event.period_from_id, chronos_event.period_to_id, chronos_event.site_id, chronos_event.school_term_id
                                                                           Index Cond: (chronos_event.id = t8.event_id)
                                                               ->  Index Scan using chronos_extralesson_pkey on public.chronos_extralesson  (cost=0.14..0.16 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=2063381)
                                                                     Output: chronos_extralesson.id, chronos_extralesson.extended_data, chronos_extralesson.week, chronos_extralesson.comment, chronos_extralesson.period_id, chronos_extralesson.room_id, chronos_extralesson.site_id, chronos_extralesson.subject_id, chronos_extralesson.school_term_id, chronos_extralesson.year
                                                                     Index Cond: (chronos_extralesson.id = t8.extra_lesson_id)
                                                         ->  Index Only Scan using chronos_lesson_groups_lesson_id_group_id_21a8a21a_uniq on public.chronos_lesson_groups  (cost=0.28..0.33 rows=1 width=8) (actual time=0.002..0.002 rows=1 loops=492384)
                                                               Output: chronos_lesson_groups.lesson_id, chronos_lesson_groups.group_id
                                                               Index Cond: (chronos_lesson_groups.lesson_id = chronos_lesson.id)
                                                               Heap Fetches: 492384
                                                               Buffers: shared hit=1477153
                                                   ->  Index Only Scan using core_group_pkey on public.core_group t18  (cost=0.28..0.36 rows=1 width=4) (actual time=0.002..0.002 rows=1 loops=492384)
                                                         Output: t18.id
                                                         Index Cond: (t18.id = chronos_lesson_groups.group_id)
                                                         Heap Fetches: 492384
                                                         Buffers: shared hit=1477153
                                             ->  Nested Loop Left Join  (cost=0.43..1.58 rows=1 width=12) (actual time=0.000..0.000 rows=0 loops=492384)
                                                   Output: chronos_extralesson_groups.group_id, chronos_extralesson_groups.extralesson_id, t22.id
                                                   Inner Unique: true
                                                   ->  Index Scan using chronos_extralesson_groups_extralesson_id_cd22f42a on public.chronos_extralesson_groups  (cost=0.15..0.23 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=492384)
                                                         Output: chronos_extralesson_groups.id, chronos_extralesson_groups.extralesson_id, chronos_extralesson_groups.group_id
                                                         Index Cond: (chronos_extralesson_groups.extralesson_id = chronos_extralesson.id)
                                                   ->  Index Only Scan using core_group_pkey on public.core_group t22  (cost=0.28..1.34 rows=1 width=4) (never executed)
                                                         Output: t22.id
                                                         Index Cond: (t22.id = chronos_extralesson_groups.group_id)
                                                         Heap Fetches: 0
                                       ->  Index Only Scan using core_group_parent_groups_from_group_id_to_group_i_cfd5deea_uniq on public.core_group_parent_groups  (cost=0.28..0.40 rows=3 width=8) (actual time=0.001..0.001 rows=1 loops=492384)
                                             Output: core_group_parent_groups.from_group_id, core_group_parent_groups.to_group_id
                                             Index Cond: (core_group_parent_groups.from_group_id = t18.id)
                                             Heap Fetches: 0
                                             Buffers: shared hit=984769
                                 ->  Index Only Scan using alsijil_personalnote_ext_personalnote_id_extramar_b2178135_uniq on public.alsijil_personalnote_extra_marks  (cost=0.28..0.30 rows=1 width=8) (actual time=0.001..0.001 rows=0 loops=492384)
                                       Output: alsijil_personalnote_extra_marks.personalnote_id, alsijil_personalnote_extra_marks.extramark_id
                                       Index Cond: (alsijil_personalnote_extra_marks.personalnote_id = t8.id)
                                       Heap Fetches: 10130
                                       Buffers: shared hit=994899
                           ->  Materialize  (cost=0.56..72.27 rows=43 width=12) (actual time=0.000..0.001 rows=17 loops=492384)
                                 Output: chronos_event_groups.group_id, chronos_event_groups.event_id, t27.to_group_id
                                 Buffers: shared hit=76 read=1
                                 ->  Nested Loop Left Join  (cost=0.56..72.05 rows=43 width=12) (actual time=0.087..0.249 rows=17 loops=1)
                                       Output: chronos_event_groups.group_id, chronos_event_groups.event_id, t27.to_group_id
                                       Buffers: shared hit=76 read=1
                                       ->  Nested Loop Left Join  (cost=0.28..65.58 rows=15 width=12) (actual time=0.053..0.152 rows=17 loops=1)
                                             Output: chronos_event_groups.group_id, chronos_event_groups.event_id, t26.id
                                             Inner Unique: true
                                             Buffers: shared hit=43
                                             ->  Seq Scan on public.chronos_event_groups  (cost=0.00..1.15 rows=15 width=8) (actual time=0.024..0.028 rows=17 loops=1)
                                                   Output: chronos_event_groups.id, chronos_event_groups.event_id, chronos_event_groups.group_id
                                                   Buffers: shared hit=1
                                             ->  Index Only Scan using core_group_pkey on public.core_group t26  (cost=0.28..4.29 rows=1 width=4) (actual time=0.006..0.006 rows=1 loops=17)
                                                   Output: t26.id
                                                   Index Cond: (t26.id = chronos_event_groups.group_id)
                                                   Heap Fetches: 7
                                                   Buffers: shared hit=42
                                       ->  Index Only Scan using core_group_parent_groups_from_group_id_to_group_i_cfd5deea_uniq on public.core_group_parent_groups t27  (cost=0.28..0.40 rows=3 width=8) (actual time=0.005..0.005 rows=0 loops=17)
                                             Output: t27.from_group_id, t27.to_group_id
                                             Index Cond: (t27.from_group_id = t26.id)
                                             Heap Fetches: 0
                                             Buffers: shared hit=33 read=1
                     ->  Index Only Scan using core_group_parent_groups_from_group_id_to_group_i_cfd5deea_uniq on public.core_group_parent_groups t23  (cost=0.28..0.40 rows=3 width=8) (actual time=0.000..0.000 rows=0 loops=492384)
                           Output: t23.from_group_id, t23.to_group_id
                           Index Cond: (t23.from_group_id = t22.id)
                           Heap Fetches: 0
               SubPlan 1
                 ->  Unique  (cost=3182.80..3182.81 rows=1 width=12) (actual time=5.178..5.180 rows=1 loops=26)
                       Output: (sum(u2.late)), u0.id
                       Buffers: shared hit=83696 read=2
                       ->  Sort  (cost=3182.80..3182.81 rows=1 width=12) (actual time=5.174..5.175 rows=1 loops=26)
                             Output: (sum(u2.late)), u0.id
                             Sort Key: (sum(u2.late))
                             Sort Method: quicksort  Memory: 25kB
                             Buffers: shared hit=83696 read=2
                             ->  GroupAggregate  (cost=3022.07..3182.79 rows=1 width=12) (actual time=5.157..5.158 rows=1 loops=26)
                                   Output: sum(u2.late), u0.id
                                   Group Key: u0.id
                                   Buffers: shared hit=83696 read=2
                                   ->  Hash Right Join  (cost=3022.07..3180.84 rows=389 width=6) (actual time=5.106..5.127 rows=134 loops=26)
                                         Output: u0.id, u2.late
                                         Hash Cond: (u21.from_group_id = u20.id)
                                         Filter: ((u11.group_id = 5856) OR (u13.to_group_id = 5856) OR (u15.group_id = 5856) OR (u17.to_group_id = 5856) OR (u19.group_id = 5856) OR (u21.to_group_id = 5856))
                                         Buffers: shared hit=83696 read=2
                                         ->  Seq Scan on public.core_group_parent_groups u21  (cost=0.00..55.83 rows=3483 width=8) (actual time=0.005..0.340 rows=3408 loops=26)
                                               Output: u21.id, u21.from_group_id, u21.to_group_id
                                               Buffers: shared hit=546
                                         ->  Hash  (cost=3006.37..3006.37 rows=1256 width=30) (actual time=3.996..3.997 rows=134 loops=26)
                                               Output: u0.id, u2.late, u11.group_id, u13.to_group_id, u15.group_id, u17.to_group_id, u19.group_id, u20.id
                                               Buckets: 2048  Batches: 1  Memory Usage: 23kB
                                               Buffers: shared hit=83150 read=2
                                               ->  Hash Left Join  (cost=888.54..3006.37 rows=1256 width=30) (actual time=2.269..3.943 rows=134 loops=26)
                                                     Output: u0.id, u2.late, u11.group_id, u13.to_group_id, u15.group_id, u17.to_group_id, u19.group_id, u20.id
                                                     Hash Cond: (u7.id = u15.extralesson_id)
                                                     Buffers: shared hit=83150 read=2
                                                     ->  Nested Loop Left Join  (cost=589.30..2686.72 rows=392 width=26) (actual time=2.216..3.853 rows=134 loops=26)
                                                           Output: u0.id, u2.late, u7.id, u11.group_id, u13.to_group_id, u19.group_id, u20.id
                                                           Buffers: shared hit=83009
                                                           ->  Nested Loop Left Join  (cost=589.02..2627.60 rows=137 width=26) (actual time=2.207..3.528 rows=134 loops=26)
                                                                 Output: u0.id, u2.late, u7.id, u11.group_id, u12.id, u19.group_id, u20.id
                                                                 Inner Unique: true
                                                                 Buffers: shared hit=76026
                                                                 ->  Hash Left Join  (cost=588.74..2578.34 rows=137 width=22) (actual time=2.198..3.240 rows=134 loops=26)
                                                                       Output: u0.id, u2.late, u7.id, u11.group_id, u19.group_id, u20.id
                                                                       Hash Cond: (u9.id = u19.event_id)
                                                                       Buffers: shared hit=65552
                                                                       ->  Nested Loop Left Join  (cost=522.97..2511.03 rows=137 width=18) (actual time=2.192..3.203 rows=134 loops=26)
                                                                             Output: u0.id, u2.late, u7.id, u9.id, u11.group_id
                                                                             Buffers: shared hit=65509
                                                                             ->  Nested Loop  (cost=522.69..2464.61 rows=137 width=18) (actual time=2.182..2.840 rows=134 loops=26)
                                                                                   Output: u0.id, u2.late, u4.id, u7.id, u9.id
                                                                                   Buffers: shared hit=55035
                                                                                   ->  Index Scan using core_person_pkey on public.core_person u0  (cost=0.28..8.30 rows=1 width=4) (actual time=0.008..0.010 rows=1 loops=26)
                                                                                         Output: u0.id, u0.extended_data, u0.is_active, u0.first_name, u0.last_name, u0.additional_name, u0.short_name, u0.street, u0.housenumber, u0.postal_code, u0.place, u0.phone_number, u0.mobile_number, u0.email, u0.date_of_birth, u0.sex, u0.photo, u0.description, u0.primary_group_id, u0.site_id, u0.user_id
                                                                                         Index Cond: (u0.id = core_person.id)
                                                                                         Filter: (u0.site_id = 1)
                                                                                         Buffers: shared hit=78
                                                                                   ->  Hash Left Join  (cost=522.41..2454.94 rows=137 width=18) (actual time=2.170..2.804 rows=134 loops=26)
                                                                                         Output: u2.late, u2.person_id, u4.id, u7.id, u9.id
                                                                                         Inner Unique: true
                                                                                         Hash Cond: (u2.event_id = u9.id)
                                                                                         Filter: ((u5.school_term_id = 2) OR (u7.school_term_id = 2) OR (u9.school_term_id = 2))
                                                                                         Rows Removed by Filter: 428
                                                                                         Buffers: shared hit=54957
                                                                                         ->  Hash Left Join  (cost=520.96..2451.88 rows=614 width=26) (actual time=0.343..2.703 rows=563 loops=26)
                                                                                               Output: u2.late, u2.person_id, u2.event_id, u4.id, u5.school_term_id, u7.id, u7.school_term_id
                                                                                               Inner Unique: true
                                                                                               Hash Cond: (u2.extra_lesson_id = u7.id)
                                                                                               Buffers: shared hit=54956
                                                                                               ->  Hash Left Join  (cost=510.67..2439.98 rows=614 width=22) (actual time=0.335..2.570 rows=563 loops=26)
                                                                                                     Output: u2.late, u2.person_id, u2.extra_lesson_id, u2.event_id, u4.id, u5.school_term_id
                                                                                                     Inner Unique: true
                                                                                                     Hash Cond: (u4.validity_id = u5.id)
                                                                                                     Buffers: shared hit=54951
                                                                                                     ->  Nested Loop Left Join  (cost=509.42..2436.50 rows=614 width=22) (actual time=0.330..2.414 rows=563 loops=26)
                                                                                                           Output: u2.late, u2.person_id, u2.extra_lesson_id, u2.event_id, u4.id, u4.validity_id
                                                                                                           Inner Unique: true
                                                                                                           Buffers: shared hit=54950
                                                                                                           ->  Hash Left Join  (cost=509.14..2233.60 rows=614 width=18) (actual time=0.320..1.244 rows=563 loops=26)
                                                                                                                 Output: u2.late, u2.person_id, u2.extra_lesson_id, u2.event_id, u3.lesson_id
                                                                                                                 Inner Unique: true
                                                                                                                 Hash Cond: (u2.lesson_period_id = u3.id)
                                                                                                                 Buffers: shared hit=11060
                                                                                                                 ->  Bitmap Heap Scan on public.alsijil_personalnote u2  (cost=9.18..1732.03 rows=614 width=18) (actual time=0.113..0.774 rows=563 loops=26)
                                                                                                                       Output: u2.id, u2.extended_data, u2.week, u2.absent, u2.late, u2.excused, u2.remarks, u2.lesson_period_id, u2.person_id, u2.site_id, u2.excuse_type_id, u2.year, u2.event_id, u2.extra_lesson_id
                                                                                                                       Recheck Cond: (u2.person_id = core_person.id)
                                                                                                                       Heap Blocks: exact=10807
                                                                                                                       Buffers: shared hit=10897
                                                                                                                       ->  Bitmap Index Scan on alsijil_personalnote_person_id_35fbe0f4  (cost=0.00..9.03 rows=614 width=0) (actual time=0.056..0.056 rows=563 loops=26)
                                                                                                                             Index Cond: (u2.person_id = core_person.id)
                                                                                                                             Buffers: shared hit=89
                                                                                                                 ->  Hash  (cost=312.76..312.76 rows=14976 width=8) (actual time=5.030..5.031 rows=14905 loops=1)
                                                                                                                       Output: u3.id, u3.lesson_id
                                                                                                                       Buckets: 16384  Batches: 1  Memory Usage: 711kB
                                                                                                                       Buffers: shared hit=163
                                                                                                                       ->  Seq Scan on public.chronos_lessonperiod u3  (cost=0.00..312.76 rows=14976 width=8) (actual time=0.007..2.741 rows=14905 loops=1)
                                                                                                                             Output: u3.id, u3.lesson_id
                                                                                                                             Buffers: shared hit=163
                                                                                                           ->  Index Scan using chronos_lesson_pkey on public.chronos_lesson u4  (cost=0.28..0.33 rows=1 width=8) (actual time=0.002..0.002 rows=1 loops=14630)
                                                                                                                 Output: u4.id, u4.extended_data, u4.site_id, u4.subject_id, u4.validity_id
                                                                                                                 Index Cond: (u4.id = u3.lesson_id)
                                                                                                                 Buffers: shared hit=43890
                                                                                                     ->  Hash  (cost=1.11..1.11 rows=11 width=8) (actual time=0.018..0.018 rows=11 loops=1)
                                                                                                           Output: u5.id, u5.school_term_id
                                                                                                           Buckets: 1024  Batches: 1  Memory Usage: 9kB
                                                                                                           Buffers: shared hit=1
                                                                                                           ->  Seq Scan on public.chronos_validityrange u5  (cost=0.00..1.11 rows=11 width=8) (actual time=0.012..0.014 rows=11 loops=1)
                                                                                                                 Output: u5.id, u5.school_term_id
                                                                                                                 Buffers: shared hit=1
                                                                                               ->  Hash  (cost=7.35..7.35 rows=235 width=8) (actual time=0.121..0.122 rows=235 loops=1)
                                                                                                     Output: u7.id, u7.school_term_id
                                                                                                     Buckets: 1024  Batches: 1  Memory Usage: 17kB
                                                                                                     Buffers: shared hit=5
                                                                                                     ->  Seq Scan on public.chronos_extralesson u7  (cost=0.00..7.35 rows=235 width=8) (actual time=0.013..0.068 rows=235 loops=1)
                                                                                                           Output: u7.id, u7.school_term_id
                                                                                                           Buffers: shared hit=5
                                                                                         ->  Hash  (cost=1.20..1.20 rows=20 width=8) (actual time=0.016..0.017 rows=29 loops=1)
                                                                                               Output: u9.id, u9.school_term_id
                                                                                               Buckets: 1024  Batches: 1  Memory Usage: 10kB
                                                                                               Buffers: shared hit=1
                                                                                               ->  Seq Scan on public.chronos_event u9  (cost=0.00..1.20 rows=20 width=8) (actual time=0.007..0.011 rows=29 loops=1)
                                                                                                     Output: u9.id, u9.school_term_id
                                                                                                     Buffers: shared hit=1
                                                                             ->  Index Only Scan using chronos_lesson_groups_lesson_id_group_id_21a8a21a_uniq on public.chronos_lesson_groups u11  (cost=0.28..0.33 rows=1 width=8) (actual time=0.002..0.002 rows=1 loops=3491)
                                                                                   Output: u11.lesson_id, u11.group_id
                                                                                   Index Cond: (u11.lesson_id = u4.id)
                                                                                   Heap Fetches: 3491
                                                                                   Buffers: shared hit=10474
                                                                       ->  Hash  (cost=65.58..65.58 rows=15 width=12) (actual time=0.053..0.054 rows=17 loops=1)
                                                                             Output: u19.event_id, u19.group_id, u20.id
                                                                             Buckets: 1024  Batches: 1  Memory Usage: 9kB
                                                                             Buffers: shared hit=43
                                                                             ->  Nested Loop Left Join  (cost=0.28..65.58 rows=15 width=12) (actual time=0.018..0.049 rows=17 loops=1)
                                                                                   Output: u19.event_id, u19.group_id, u20.id
                                                                                   Inner Unique: true
                                                                                   Buffers: shared hit=43
                                                                                   ->  Seq Scan on public.chronos_event_groups u19  (cost=0.00..1.15 rows=15 width=8) (actual time=0.006..0.007 rows=17 loops=1)
                                                                                         Output: u19.id, u19.event_id, u19.group_id
                                                                                         Buffers: shared hit=1
                                                                                   ->  Index Only Scan using core_group_pkey on public.core_group u20  (cost=0.28..4.29 rows=1 width=4) (actual time=0.002..0.002 rows=1 loops=17)
                                                                                         Output: u20.id
                                                                                         Index Cond: (u20.id = u19.group_id)
                                                                                         Heap Fetches: 7
                                                                                         Buffers: shared hit=42
                                                                 ->  Index Only Scan using core_group_pkey on public.core_group u12  (cost=0.28..0.36 rows=1 width=4) (actual time=0.002..0.002 rows=1 loops=3491)
                                                                       Output: u12.id
                                                                       Index Cond: (u12.id = u11.group_id)
                                                                       Heap Fetches: 3491
                                                                       Buffers: shared hit=10474
                                                           ->  Index Only Scan using core_group_parent_groups_from_group_id_to_group_i_cfd5deea_uniq on public.core_group_parent_groups u13  (cost=0.28..0.40 rows=3 width=8) (actual time=0.002..0.002 rows=1 loops=3491)
                                                                 Output: u13.from_group_id, u13.to_group_id
                                                                 Index Cond: (u13.from_group_id = u12.id)
                                                                 Heap Fetches: 0
                                                                 Buffers: shared hit=6983
                                                     ->  Hash  (cost=289.83..289.83 rows=753 width=12) (actual time=1.292..1.295 rows=265 loops=1)
                                                           Output: u15.extralesson_id, u15.group_id, u17.to_group_id
                                                           Buckets: 1024  Batches: 1  Memory Usage: 19kB
                                                           Buffers: shared hit=141 read=2
                                                           ->  Hash Right Join  (cost=213.41..289.83 rows=753 width=12) (actual time=1.230..1.256 rows=265 loops=1)
                                                                 Output: u15.extralesson_id, u15.group_id, u17.to_group_id
                                                                 Hash Cond: (u17.from_group_id = u16.id)
                                                                 Buffers: shared hit=141 read=2
                                                                 ->  Seq Scan on public.core_group_parent_groups u17  (cost=0.00..55.83 rows=3483 width=8) (actual time=0.015..0.304 rows=3408 loops=1)
                                                                       Output: u17.id, u17.from_group_id, u17.to_group_id
                                                                       Buffers: shared hit=21
                                                                 ->  Hash  (cost=210.13..210.13 rows=263 width=12) (actual time=0.588..0.590 rows=265 loops=1)
                                                                       Output: u15.extralesson_id, u15.group_id, u16.id
                                                                       Buckets: 1024  Batches: 1  Memory Usage: 20kB
                                                                       Buffers: shared hit=120 read=2
                                                                       ->  Merge Left Join  (cost=21.79..210.13 rows=263 width=12) (actual time=0.127..0.551 rows=265 loops=1)
                                                                             Output: u15.extralesson_id, u15.group_id, u16.id
                                                                             Inner Unique: true
                                                                             Merge Cond: (u15.group_id = u16.id)
                                                                             Buffers: shared hit=120 read=2
                                                                             ->  Sort  (cost=15.20..15.86 rows=263 width=8) (actual time=0.083..0.099 rows=265 loops=1)
                                                                                   Output: u15.extralesson_id, u15.group_id
                                                                                   Sort Key: u15.group_id
                                                                                   Sort Method: quicksort  Memory: 37kB
                                                                                   Buffers: shared hit=2
                                                                                   ->  Seq Scan on public.chronos_extralesson_groups u15  (cost=0.00..4.63 rows=263 width=8) (actual time=0.009..0.034 rows=265 loops=1)
                                                                                         Output: u15.extralesson_id, u15.group_id
                                                                                         Buffers: shared hit=2
                                                                             ->  Index Only Scan using core_group_pkey on public.core_group u16  (cost=0.28..346.23 rows=1217 width=4) (actual time=0.008..0.353 rows=665 loops=1)
                                                                                   Output: u16.id
                                                                                   Heap Fetches: 198
                                                                                   Buffers: shared hit=118 read=2
 Planning:
   Buffers: shared hit=1822 read=2
 Planning Time: 17.074 ms
 JIT:
   Functions: 201
   Options: Inlining true, Optimization true, Expressions true, Deforming true
   Timing: Generation 22.134 ms, Inlining 80.809 ms, Optimization 1289.741 ms, Emission 772.041 ms, Total 2164.725 ms
 Execution Time: 25581.276 ms
Example plan form production: ``` Unique (cost=8046541.85..8046717.27 rows=2506 width=210) (actual time=25504.349..25504.471 rows=26 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND (t8.excuse_type_id IS NULL) AND t8.excused AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND (NOT t8.excused) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), ((SubPlan 1)), (count(DISTINCT t8.id) FILTER (WHERE (((t8.late <> 0) OR (t8.late IS NULL)) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE ((alsijil_personalnote_extra_marks.extramark_id = 1) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.absent) FILTER (WHERE (t8.absent AND (t8.excuse_type_id = 1) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))) Buffers: shared hit=18990721 read=111 -> Sort (cost=8046541.85..8046548.12 rows=2506 width=210) (actual time=25504.348..25504.396 rows=26 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND (t8.excuse_type_id IS NULL) AND t8.excused AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND (NOT t8.excused) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), ((SubPlan 1)), (count(DISTINCT t8.id) FILTER (WHERE (((t8.late <> 0) OR (t8.late IS NULL)) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE ((alsijil_personalnote_extra_marks.extramark_id = 1) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.absent) FILTER (WHERE (t8.absent AND (t8.excuse_type_id = 1) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))) Sort Key: core_person.id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND (t8.excuse_type_id IS NULL) AND t8.excused AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND (NOT t8.excused) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), ((SubPlan 1)), (count(DISTINCT t8.id) FILTER (WHERE (((t8.late <> 0) OR (t8.late IS NULL)) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.id) FILTER (WHERE ((alsijil_personalnote_extra_marks.extramark_id = 1) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))), (count(DISTINCT t8.absent) FILTER (WHERE (t8.absent AND (t8.excuse_type_id = 1) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856))))) Sort Method: quicksort Memory: 38kB Buffers: shared hit=18990721 read=111 -> GroupAggregate (cost=48.63..8046400.38 rows=2506 width=210) (actual time=2946.403..25504.119 rows=26 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856)))), count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND (t8.excuse_type_id IS NULL) AND t8.excused AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856)))), count(DISTINCT t8.id) FILTER (WHERE (t8.absent AND (NOT t8.excused) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856)))), (SubPlan 1), count(DISTINCT t8.id) FILTER (WHERE (((t8.late <> 0) OR (t8.late IS NULL)) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856)))), count(DISTINCT t8.id) FILTER (WHERE ((alsijil_personalnote_extra_marks.extramark_id = 1) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856)))), count(DISTINCT t8.absent) FILTER (WHERE (t8.absent AND (t8.excuse_type_id = 1) AND ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) AND ((chronos_lesson_groups.group_id = 5856) OR (core_group_parent_groups.to_group_id = 5856) OR (chronos_extralesson_groups.group_id = 5856) OR (t23.to_group_id = 5856) OR (chronos_event_groups.group_id = 5856) OR (t27.to_group_id = 5856)))) Group Key: core_person.id Buffers: shared hit=18990702 read=111 -> Nested Loop Left Join (cost=48.63..56111.28 rows=88412 width=206) (actual time=2158.051..25261.753 rows=492384 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, chronos_validityrange.school_term_id, chronos_extralesson.school_term_id, chronos_event.school_term_id, chronos_lesson_groups.group_id, core_group_parent_groups.to_group_id, chronos_extralesson_groups.group_id, t23.to_group_id, chronos_event_groups.group_id, t27.to_group_id, t8.excuse_type_id, t8.excused, t8.late, alsijil_personalnote_extra_marks.extramark_id Buffers: shared hit=18907006 read=109 -> Nested Loop Left Join (cost=48.35..42780.70 rows=30892 width=206) (actual time=2158.034..24953.786 rows=492384 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, chronos_validityrange.school_term_id, chronos_extralesson.school_term_id, chronos_event.school_term_id, chronos_lesson_groups.group_id, core_group_parent_groups.to_group_id, chronos_extralesson_groups.group_id, t22.id, chronos_event_groups.group_id, t27.to_group_id, alsijil_personalnote_extra_marks.extramark_id Join Filter: (chronos_event.id = chronos_event_groups.event_id) Rows Removed by Join Filter: 8370528 Buffers: shared hit=18907006 read=109 -> Nested Loop Left Join (cost=47.79..35746.41 rows=10794 width=202) (actual time=2157.765..23509.580 rows=492384 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, chronos_validityrange.school_term_id, chronos_extralesson.school_term_id, chronos_event.school_term_id, chronos_event.id, chronos_lesson_groups.group_id, core_group_parent_groups.to_group_id, chronos_extralesson_groups.group_id, t22.id, alsijil_personalnote_extra_marks.extramark_id Buffers: shared hit=18906930 read=108 -> Nested Loop Left Join (cost=47.51..32425.59 rows=10794 width=198) (actual time=2157.741..22588.217 rows=492384 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, chronos_validityrange.school_term_id, chronos_extralesson.school_term_id, chronos_event.school_term_id, chronos_event.id, chronos_lesson_groups.group_id, core_group_parent_groups.to_group_id, chronos_extralesson_groups.group_id, t22.id Buffers: shared hit=17912031 read=108 -> Nested Loop Left Join (cost=47.23..30797.89 rows=3772 width=198) (actual time=2157.706..21644.067 rows=492384 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, chronos_validityrange.school_term_id, chronos_extralesson.school_term_id, chronos_event.school_term_id, chronos_event.id, chronos_lesson_groups.group_id, t18.id, chronos_extralesson_groups.group_id, t22.id Buffers: shared hit=16927262 read=108 -> Nested Loop Left Join (cost=46.81..25442.06 rows=3370 width=194) (actual time=2157.689..21231.304 rows=492384 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, chronos_validityrange.school_term_id, chronos_extralesson.school_term_id, chronos_extralesson.id, chronos_event.school_term_id, chronos_event.id, chronos_lesson_groups.group_id, t18.id Inner Unique: true Buffers: shared hit=16927262 read=108 -> Nested Loop Left Join (cost=46.53..24230.45 rows=3370 width=190) (actual time=2157.670..20145.244 rows=492384 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, chronos_validityrange.school_term_id, chronos_extralesson.school_term_id, chronos_extralesson.id, chronos_event.school_term_id, chronos_event.id, chronos_lesson_groups.group_id Buffers: shared hit=15450109 read=108 -> Nested Loop Left Join (cost=46.25..23088.71 rows=3370 width=190) (actual time=2157.641..18925.858 rows=492384 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, chronos_lesson.id, chronos_validityrange.school_term_id, chronos_extralesson.school_term_id, chronos_extralesson.id, chronos_event.school_term_id, chronos_event.id Inner Unique: true Filter: ((chronos_validityrange.school_term_id = 2) OR (chronos_extralesson.school_term_id = 2) OR (chronos_event.school_term_id = 2)) Rows Removed by Filter: 1570997 Buffers: shared hit=13972956 read=108 -> Nested Loop Left Join (cost=46.10..20364.32 rows=15131 width=186) (actual time=2153.024..17933.461 rows=2063381 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, t8.extra_lesson_id, chronos_lesson.id, chronos_validityrange.school_term_id, chronos_event.school_term_id, chronos_event.id Inner Unique: true Buffers: shared hit=13972956 read=108 -> Nested Loop Left Join (cost=45.96..18018.65 rows=15131 width=182) (actual time=2153.017..16666.081 rows=2063381 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, t8.extra_lesson_id, t8.event_id, chronos_lesson.id, chronos_validityrange.school_term_id Inner Unique: true Join Filter: (chronos_lesson.validity_id = chronos_validityrange.id) Rows Removed by Join Filter: 11196096 Buffers: shared hit=13972956 read=108 -> Nested Loop Left Join (cost=45.96..15710.09 rows=15131 width=182) (actual time=2152.993..14168.297 rows=2063381 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, t8.extra_lesson_id, t8.event_id, chronos_lesson.id, chronos_lesson.validity_id Inner Unique: true Buffers: shared hit=13972955 read=108 -> Nested Loop Left Join (cost=45.68..10710.17 rows=15131 width=178) (actual time=2152.981..9830.726 rows=2063381 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, t8.extra_lesson_id, t8.event_id, chronos_lessonperiod.lesson_id Inner Unique: true Buffers: shared hit=7782812 read=108 -> Nested Loop Left Join (cost=45.40..6109.06 rows=15131 width=178) (actual time=2152.959..4966.810 rows=2063381 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, t8.id, t8.absent, t8.excuse_type_id, t8.excused, t8.late, t8.lesson_period_id, t8.extra_lesson_id, t8.event_id Buffers: shared hit=1592669 read=108 -> Nested Loop (cost=44.97..4210.92 rows=73 width=154) (actual time=2152.927..2278.370 rows=3667 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description Inner Unique: true Buffers: shared hit=55394 read=108 -> Nested Loop (cost=44.54..968.86 rows=4767 width=158) (actual time=2147.952..2178.476 rows=14630 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, alsijil_personalnote.id Buffers: shared hit=11238 -> Merge Join (cost=44.12..370.82 rows=23 width=158) (actual time=2147.928..2149.761 rows=26 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, core_persongroupthrough.person_id Merge Cond: (core_person.id = core_persongroupthrough.person_id) Buffers: shared hit=339 -> Index Scan using core_person_pkey on public.core_person (cost=0.28..322.73 rows=2506 width=154) (actual time=2147.639..2149.154 rows=2177 loops=1) Output: core_person.id, core_person.extended_data, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.description, core_person.primary_group_id, core_person.site_id, core_person.user_id Filter: (core_person.site_id = 1) Buffers: shared hit=317 -> Sort (cost=43.70..43.76 rows=23 width=4) (actual time=0.174..0.221 rows=26 loops=1) Output: core_persongroupthrough.person_id Sort Key: core_persongroupthrough.person_id Sort Method: quicksort Memory: 26kB Buffers: shared hit=22 -> Index Scan using core_persongroupthrough_group_id_62316e93 on public.core_persongroupthrough (cost=0.29..43.18 rows=23 width=4) (actual time=0.043..0.152 rows=26 loops=1) Output: core_persongroupthrough.person_id Index Cond: (core_persongroupthrough.group_id = 5856) Buffers: shared hit=22 -> Index Scan using alsijil_personalnote_person_id_35fbe0f4 on public.alsijil_personalnote (cost=0.42..19.86 rows=614 width=8) (actual time=0.017..0.838 rows=563 loops=26) Output: alsijil_personalnote.id, alsijil_personalnote.extended_data, alsijil_personalnote.week, alsijil_personalnote.absent, alsijil_personalnote.late, alsijil_personalnote.excused, alsijil_personalnote.remarks, alsijil_personalnote.lesson_period_id, alsijil_personalnote.person_id, alsijil_personalnote.site_id, alsijil_personalnote.excuse_type_id, alsijil_personalnote.year, alsijil_personalnote.event_id, alsijil_personalnote.extra_lesson_id Index Cond: (alsijil_personalnote.person_id = core_person.id) Buffers: shared hit=10899 -> Index Only Scan using alsijil_personalnote_gro_personalnote_id_group_id_2fbbd65b_uniq on public.alsijil_personalnote_groups_of_person (cost=0.43..0.68 rows=1 width=4) (actual time=0.006..0.006 rows=0 loops=14630) Output: alsijil_personalnote_groups_of_person.personalnote_id, alsijil_personalnote_groups_of_person.group_id Index Cond: ((alsijil_personalnote_groups_of_person.personalnote_id = alsijil_personalnote.id) AND (alsijil_personalnote_groups_of_person.group_id = 5856)) Heap Fetches: 373 Buffers: shared hit=44156 read=108 -> Index Scan using alsijil_personalnote_person_id_35fbe0f4 on public.alsijil_personalnote t8 (cost=0.42..19.86 rows=614 width=28) (actual time=0.009..0.604 rows=563 loops=3667) Output: t8.id, t8.extended_data, t8.week, t8.absent, t8.late, t8.excused, t8.remarks, t8.lesson_period_id, t8.person_id, t8.site_id, t8.excuse_type_id, t8.year, t8.event_id, t8.extra_lesson_id Index Cond: (t8.person_id = core_person.id) Buffers: shared hit=1537275 -> Index Scan using chronos_lessonperiod_pkey on public.chronos_lessonperiod (cost=0.29..0.30 rows=1 width=8) (actual time=0.002..0.002 rows=1 loops=2063381) Output: chronos_lessonperiod.id, chronos_lessonperiod.extended_data, chronos_lessonperiod.lesson_id, chronos_lessonperiod.period_id, chronos_lessonperiod.room_id, chronos_lessonperiod.site_id Index Cond: (chronos_lessonperiod.id = t8.lesson_period_id) Buffers: shared hit=6190143 -> Index Scan using chronos_lesson_pkey on public.chronos_lesson (cost=0.28..0.33 rows=1 width=8) (actual time=0.002..0.002 rows=1 loops=2063381) Output: chronos_lesson.id, chronos_lesson.extended_data, chronos_lesson.site_id, chronos_lesson.subject_id, chronos_lesson.validity_id Index Cond: (chronos_lesson.id = chronos_lessonperiod.lesson_id) Buffers: shared hit=6190143 -> Materialize (cost=0.00..1.17 rows=11 width=8) (actual time=0.000..0.000 rows=6 loops=2063381) Output: chronos_validityrange.school_term_id, chronos_validityrange.id Buffers: shared hit=1 -> Seq Scan on public.chronos_validityrange (cost=0.00..1.11 rows=11 width=8) (actual time=0.014..0.021 rows=10 loops=1) Output: chronos_validityrange.school_term_id, chronos_validityrange.id Buffers: shared hit=1 -> Index Scan using chronos_event_pkey on public.chronos_event (cost=0.14..0.16 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=2063381) Output: chronos_event.id, chronos_event.extended_data, chronos_event.title, chronos_event.date_start, chronos_event.date_end, chronos_event.period_from_id, chronos_event.period_to_id, chronos_event.site_id, chronos_event.school_term_id Index Cond: (chronos_event.id = t8.event_id) -> Index Scan using chronos_extralesson_pkey on public.chronos_extralesson (cost=0.14..0.16 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=2063381) Output: chronos_extralesson.id, chronos_extralesson.extended_data, chronos_extralesson.week, chronos_extralesson.comment, chronos_extralesson.period_id, chronos_extralesson.room_id, chronos_extralesson.site_id, chronos_extralesson.subject_id, chronos_extralesson.school_term_id, chronos_extralesson.year Index Cond: (chronos_extralesson.id = t8.extra_lesson_id) -> Index Only Scan using chronos_lesson_groups_lesson_id_group_id_21a8a21a_uniq on public.chronos_lesson_groups (cost=0.28..0.33 rows=1 width=8) (actual time=0.002..0.002 rows=1 loops=492384) Output: chronos_lesson_groups.lesson_id, chronos_lesson_groups.group_id Index Cond: (chronos_lesson_groups.lesson_id = chronos_lesson.id) Heap Fetches: 492384 Buffers: shared hit=1477153 -> Index Only Scan using core_group_pkey on public.core_group t18 (cost=0.28..0.36 rows=1 width=4) (actual time=0.002..0.002 rows=1 loops=492384) Output: t18.id Index Cond: (t18.id = chronos_lesson_groups.group_id) Heap Fetches: 492384 Buffers: shared hit=1477153 -> Nested Loop Left Join (cost=0.43..1.58 rows=1 width=12) (actual time=0.000..0.000 rows=0 loops=492384) Output: chronos_extralesson_groups.group_id, chronos_extralesson_groups.extralesson_id, t22.id Inner Unique: true -> Index Scan using chronos_extralesson_groups_extralesson_id_cd22f42a on public.chronos_extralesson_groups (cost=0.15..0.23 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=492384) Output: chronos_extralesson_groups.id, chronos_extralesson_groups.extralesson_id, chronos_extralesson_groups.group_id Index Cond: (chronos_extralesson_groups.extralesson_id = chronos_extralesson.id) -> Index Only Scan using core_group_pkey on public.core_group t22 (cost=0.28..1.34 rows=1 width=4) (never executed) Output: t22.id Index Cond: (t22.id = chronos_extralesson_groups.group_id) Heap Fetches: 0 -> Index Only Scan using core_group_parent_groups_from_group_id_to_group_i_cfd5deea_uniq on public.core_group_parent_groups (cost=0.28..0.40 rows=3 width=8) (actual time=0.001..0.001 rows=1 loops=492384) Output: core_group_parent_groups.from_group_id, core_group_parent_groups.to_group_id Index Cond: (core_group_parent_groups.from_group_id = t18.id) Heap Fetches: 0 Buffers: shared hit=984769 -> Index Only Scan using alsijil_personalnote_ext_personalnote_id_extramar_b2178135_uniq on public.alsijil_personalnote_extra_marks (cost=0.28..0.30 rows=1 width=8) (actual time=0.001..0.001 rows=0 loops=492384) Output: alsijil_personalnote_extra_marks.personalnote_id, alsijil_personalnote_extra_marks.extramark_id Index Cond: (alsijil_personalnote_extra_marks.personalnote_id = t8.id) Heap Fetches: 10130 Buffers: shared hit=994899 -> Materialize (cost=0.56..72.27 rows=43 width=12) (actual time=0.000..0.001 rows=17 loops=492384) Output: chronos_event_groups.group_id, chronos_event_groups.event_id, t27.to_group_id Buffers: shared hit=76 read=1 -> Nested Loop Left Join (cost=0.56..72.05 rows=43 width=12) (actual time=0.087..0.249 rows=17 loops=1) Output: chronos_event_groups.group_id, chronos_event_groups.event_id, t27.to_group_id Buffers: shared hit=76 read=1 -> Nested Loop Left Join (cost=0.28..65.58 rows=15 width=12) (actual time=0.053..0.152 rows=17 loops=1) Output: chronos_event_groups.group_id, chronos_event_groups.event_id, t26.id Inner Unique: true Buffers: shared hit=43 -> Seq Scan on public.chronos_event_groups (cost=0.00..1.15 rows=15 width=8) (actual time=0.024..0.028 rows=17 loops=1) Output: chronos_event_groups.id, chronos_event_groups.event_id, chronos_event_groups.group_id Buffers: shared hit=1 -> Index Only Scan using core_group_pkey on public.core_group t26 (cost=0.28..4.29 rows=1 width=4) (actual time=0.006..0.006 rows=1 loops=17) Output: t26.id Index Cond: (t26.id = chronos_event_groups.group_id) Heap Fetches: 7 Buffers: shared hit=42 -> Index Only Scan using core_group_parent_groups_from_group_id_to_group_i_cfd5deea_uniq on public.core_group_parent_groups t27 (cost=0.28..0.40 rows=3 width=8) (actual time=0.005..0.005 rows=0 loops=17) Output: t27.from_group_id, t27.to_group_id Index Cond: (t27.from_group_id = t26.id) Heap Fetches: 0 Buffers: shared hit=33 read=1 -> Index Only Scan using core_group_parent_groups_from_group_id_to_group_i_cfd5deea_uniq on public.core_group_parent_groups t23 (cost=0.28..0.40 rows=3 width=8) (actual time=0.000..0.000 rows=0 loops=492384) Output: t23.from_group_id, t23.to_group_id Index Cond: (t23.from_group_id = t22.id) Heap Fetches: 0 SubPlan 1 -> Unique (cost=3182.80..3182.81 rows=1 width=12) (actual time=5.178..5.180 rows=1 loops=26) Output: (sum(u2.late)), u0.id Buffers: shared hit=83696 read=2 -> Sort (cost=3182.80..3182.81 rows=1 width=12) (actual time=5.174..5.175 rows=1 loops=26) Output: (sum(u2.late)), u0.id Sort Key: (sum(u2.late)) Sort Method: quicksort Memory: 25kB Buffers: shared hit=83696 read=2 -> GroupAggregate (cost=3022.07..3182.79 rows=1 width=12) (actual time=5.157..5.158 rows=1 loops=26) Output: sum(u2.late), u0.id Group Key: u0.id Buffers: shared hit=83696 read=2 -> Hash Right Join (cost=3022.07..3180.84 rows=389 width=6) (actual time=5.106..5.127 rows=134 loops=26) Output: u0.id, u2.late Hash Cond: (u21.from_group_id = u20.id) Filter: ((u11.group_id = 5856) OR (u13.to_group_id = 5856) OR (u15.group_id = 5856) OR (u17.to_group_id = 5856) OR (u19.group_id = 5856) OR (u21.to_group_id = 5856)) Buffers: shared hit=83696 read=2 -> Seq Scan on public.core_group_parent_groups u21 (cost=0.00..55.83 rows=3483 width=8) (actual time=0.005..0.340 rows=3408 loops=26) Output: u21.id, u21.from_group_id, u21.to_group_id Buffers: shared hit=546 -> Hash (cost=3006.37..3006.37 rows=1256 width=30) (actual time=3.996..3.997 rows=134 loops=26) Output: u0.id, u2.late, u11.group_id, u13.to_group_id, u15.group_id, u17.to_group_id, u19.group_id, u20.id Buckets: 2048 Batches: 1 Memory Usage: 23kB Buffers: shared hit=83150 read=2 -> Hash Left Join (cost=888.54..3006.37 rows=1256 width=30) (actual time=2.269..3.943 rows=134 loops=26) Output: u0.id, u2.late, u11.group_id, u13.to_group_id, u15.group_id, u17.to_group_id, u19.group_id, u20.id Hash Cond: (u7.id = u15.extralesson_id) Buffers: shared hit=83150 read=2 -> Nested Loop Left Join (cost=589.30..2686.72 rows=392 width=26) (actual time=2.216..3.853 rows=134 loops=26) Output: u0.id, u2.late, u7.id, u11.group_id, u13.to_group_id, u19.group_id, u20.id Buffers: shared hit=83009 -> Nested Loop Left Join (cost=589.02..2627.60 rows=137 width=26) (actual time=2.207..3.528 rows=134 loops=26) Output: u0.id, u2.late, u7.id, u11.group_id, u12.id, u19.group_id, u20.id Inner Unique: true Buffers: shared hit=76026 -> Hash Left Join (cost=588.74..2578.34 rows=137 width=22) (actual time=2.198..3.240 rows=134 loops=26) Output: u0.id, u2.late, u7.id, u11.group_id, u19.group_id, u20.id Hash Cond: (u9.id = u19.event_id) Buffers: shared hit=65552 -> Nested Loop Left Join (cost=522.97..2511.03 rows=137 width=18) (actual time=2.192..3.203 rows=134 loops=26) Output: u0.id, u2.late, u7.id, u9.id, u11.group_id Buffers: shared hit=65509 -> Nested Loop (cost=522.69..2464.61 rows=137 width=18) (actual time=2.182..2.840 rows=134 loops=26) Output: u0.id, u2.late, u4.id, u7.id, u9.id Buffers: shared hit=55035 -> Index Scan using core_person_pkey on public.core_person u0 (cost=0.28..8.30 rows=1 width=4) (actual time=0.008..0.010 rows=1 loops=26) Output: u0.id, u0.extended_data, u0.is_active, u0.first_name, u0.last_name, u0.additional_name, u0.short_name, u0.street, u0.housenumber, u0.postal_code, u0.place, u0.phone_number, u0.mobile_number, u0.email, u0.date_of_birth, u0.sex, u0.photo, u0.description, u0.primary_group_id, u0.site_id, u0.user_id Index Cond: (u0.id = core_person.id) Filter: (u0.site_id = 1) Buffers: shared hit=78 -> Hash Left Join (cost=522.41..2454.94 rows=137 width=18) (actual time=2.170..2.804 rows=134 loops=26) Output: u2.late, u2.person_id, u4.id, u7.id, u9.id Inner Unique: true Hash Cond: (u2.event_id = u9.id) Filter: ((u5.school_term_id = 2) OR (u7.school_term_id = 2) OR (u9.school_term_id = 2)) Rows Removed by Filter: 428 Buffers: shared hit=54957 -> Hash Left Join (cost=520.96..2451.88 rows=614 width=26) (actual time=0.343..2.703 rows=563 loops=26) Output: u2.late, u2.person_id, u2.event_id, u4.id, u5.school_term_id, u7.id, u7.school_term_id Inner Unique: true Hash Cond: (u2.extra_lesson_id = u7.id) Buffers: shared hit=54956 -> Hash Left Join (cost=510.67..2439.98 rows=614 width=22) (actual time=0.335..2.570 rows=563 loops=26) Output: u2.late, u2.person_id, u2.extra_lesson_id, u2.event_id, u4.id, u5.school_term_id Inner Unique: true Hash Cond: (u4.validity_id = u5.id) Buffers: shared hit=54951 -> Nested Loop Left Join (cost=509.42..2436.50 rows=614 width=22) (actual time=0.330..2.414 rows=563 loops=26) Output: u2.late, u2.person_id, u2.extra_lesson_id, u2.event_id, u4.id, u4.validity_id Inner Unique: true Buffers: shared hit=54950 -> Hash Left Join (cost=509.14..2233.60 rows=614 width=18) (actual time=0.320..1.244 rows=563 loops=26) Output: u2.late, u2.person_id, u2.extra_lesson_id, u2.event_id, u3.lesson_id Inner Unique: true Hash Cond: (u2.lesson_period_id = u3.id) Buffers: shared hit=11060 -> Bitmap Heap Scan on public.alsijil_personalnote u2 (cost=9.18..1732.03 rows=614 width=18) (actual time=0.113..0.774 rows=563 loops=26) Output: u2.id, u2.extended_data, u2.week, u2.absent, u2.late, u2.excused, u2.remarks, u2.lesson_period_id, u2.person_id, u2.site_id, u2.excuse_type_id, u2.year, u2.event_id, u2.extra_lesson_id Recheck Cond: (u2.person_id = core_person.id) Heap Blocks: exact=10807 Buffers: shared hit=10897 -> Bitmap Index Scan on alsijil_personalnote_person_id_35fbe0f4 (cost=0.00..9.03 rows=614 width=0) (actual time=0.056..0.056 rows=563 loops=26) Index Cond: (u2.person_id = core_person.id) Buffers: shared hit=89 -> Hash (cost=312.76..312.76 rows=14976 width=8) (actual time=5.030..5.031 rows=14905 loops=1) Output: u3.id, u3.lesson_id Buckets: 16384 Batches: 1 Memory Usage: 711kB Buffers: shared hit=163 -> Seq Scan on public.chronos_lessonperiod u3 (cost=0.00..312.76 rows=14976 width=8) (actual time=0.007..2.741 rows=14905 loops=1) Output: u3.id, u3.lesson_id Buffers: shared hit=163 -> Index Scan using chronos_lesson_pkey on public.chronos_lesson u4 (cost=0.28..0.33 rows=1 width=8) (actual time=0.002..0.002 rows=1 loops=14630) Output: u4.id, u4.extended_data, u4.site_id, u4.subject_id, u4.validity_id Index Cond: (u4.id = u3.lesson_id) Buffers: shared hit=43890 -> Hash (cost=1.11..1.11 rows=11 width=8) (actual time=0.018..0.018 rows=11 loops=1) Output: u5.id, u5.school_term_id Buckets: 1024 Batches: 1 Memory Usage: 9kB Buffers: shared hit=1 -> Seq Scan on public.chronos_validityrange u5 (cost=0.00..1.11 rows=11 width=8) (actual time=0.012..0.014 rows=11 loops=1) Output: u5.id, u5.school_term_id Buffers: shared hit=1 -> Hash (cost=7.35..7.35 rows=235 width=8) (actual time=0.121..0.122 rows=235 loops=1) Output: u7.id, u7.school_term_id Buckets: 1024 Batches: 1 Memory Usage: 17kB Buffers: shared hit=5 -> Seq Scan on public.chronos_extralesson u7 (cost=0.00..7.35 rows=235 width=8) (actual time=0.013..0.068 rows=235 loops=1) Output: u7.id, u7.school_term_id Buffers: shared hit=5 -> Hash (cost=1.20..1.20 rows=20 width=8) (actual time=0.016..0.017 rows=29 loops=1) Output: u9.id, u9.school_term_id Buckets: 1024 Batches: 1 Memory Usage: 10kB Buffers: shared hit=1 -> Seq Scan on public.chronos_event u9 (cost=0.00..1.20 rows=20 width=8) (actual time=0.007..0.011 rows=29 loops=1) Output: u9.id, u9.school_term_id Buffers: shared hit=1 -> Index Only Scan using chronos_lesson_groups_lesson_id_group_id_21a8a21a_uniq on public.chronos_lesson_groups u11 (cost=0.28..0.33 rows=1 width=8) (actual time=0.002..0.002 rows=1 loops=3491) Output: u11.lesson_id, u11.group_id Index Cond: (u11.lesson_id = u4.id) Heap Fetches: 3491 Buffers: shared hit=10474 -> Hash (cost=65.58..65.58 rows=15 width=12) (actual time=0.053..0.054 rows=17 loops=1) Output: u19.event_id, u19.group_id, u20.id Buckets: 1024 Batches: 1 Memory Usage: 9kB Buffers: shared hit=43 -> Nested Loop Left Join (cost=0.28..65.58 rows=15 width=12) (actual time=0.018..0.049 rows=17 loops=1) Output: u19.event_id, u19.group_id, u20.id Inner Unique: true Buffers: shared hit=43 -> Seq Scan on public.chronos_event_groups u19 (cost=0.00..1.15 rows=15 width=8) (actual time=0.006..0.007 rows=17 loops=1) Output: u19.id, u19.event_id, u19.group_id Buffers: shared hit=1 -> Index Only Scan using core_group_pkey on public.core_group u20 (cost=0.28..4.29 rows=1 width=4) (actual time=0.002..0.002 rows=1 loops=17) Output: u20.id Index Cond: (u20.id = u19.group_id) Heap Fetches: 7 Buffers: shared hit=42 -> Index Only Scan using core_group_pkey on public.core_group u12 (cost=0.28..0.36 rows=1 width=4) (actual time=0.002..0.002 rows=1 loops=3491) Output: u12.id Index Cond: (u12.id = u11.group_id) Heap Fetches: 3491 Buffers: shared hit=10474 -> Index Only Scan using core_group_parent_groups_from_group_id_to_group_i_cfd5deea_uniq on public.core_group_parent_groups u13 (cost=0.28..0.40 rows=3 width=8) (actual time=0.002..0.002 rows=1 loops=3491) Output: u13.from_group_id, u13.to_group_id Index Cond: (u13.from_group_id = u12.id) Heap Fetches: 0 Buffers: shared hit=6983 -> Hash (cost=289.83..289.83 rows=753 width=12) (actual time=1.292..1.295 rows=265 loops=1) Output: u15.extralesson_id, u15.group_id, u17.to_group_id Buckets: 1024 Batches: 1 Memory Usage: 19kB Buffers: shared hit=141 read=2 -> Hash Right Join (cost=213.41..289.83 rows=753 width=12) (actual time=1.230..1.256 rows=265 loops=1) Output: u15.extralesson_id, u15.group_id, u17.to_group_id Hash Cond: (u17.from_group_id = u16.id) Buffers: shared hit=141 read=2 -> Seq Scan on public.core_group_parent_groups u17 (cost=0.00..55.83 rows=3483 width=8) (actual time=0.015..0.304 rows=3408 loops=1) Output: u17.id, u17.from_group_id, u17.to_group_id Buffers: shared hit=21 -> Hash (cost=210.13..210.13 rows=263 width=12) (actual time=0.588..0.590 rows=265 loops=1) Output: u15.extralesson_id, u15.group_id, u16.id Buckets: 1024 Batches: 1 Memory Usage: 20kB Buffers: shared hit=120 read=2 -> Merge Left Join (cost=21.79..210.13 rows=263 width=12) (actual time=0.127..0.551 rows=265 loops=1) Output: u15.extralesson_id, u15.group_id, u16.id Inner Unique: true Merge Cond: (u15.group_id = u16.id) Buffers: shared hit=120 read=2 -> Sort (cost=15.20..15.86 rows=263 width=8) (actual time=0.083..0.099 rows=265 loops=1) Output: u15.extralesson_id, u15.group_id Sort Key: u15.group_id Sort Method: quicksort Memory: 37kB Buffers: shared hit=2 -> Seq Scan on public.chronos_extralesson_groups u15 (cost=0.00..4.63 rows=263 width=8) (actual time=0.009..0.034 rows=265 loops=1) Output: u15.extralesson_id, u15.group_id Buffers: shared hit=2 -> Index Only Scan using core_group_pkey on public.core_group u16 (cost=0.28..346.23 rows=1217 width=4) (actual time=0.008..0.353 rows=665 loops=1) Output: u16.id Heap Fetches: 198 Buffers: shared hit=118 read=2 Planning: Buffers: shared hit=1822 read=2 Planning Time: 17.074 ms JIT: Functions: 201 Options: Inlining true, Optimization true, Expressions true, Deforming true Timing: Generation 22.134 ms, Inlining 80.809 ms, Optimization 1289.741 ms, Emission 772.041 ms, Total 2164.725 ms Execution Time: 25581.276 ms ```
Owner

No lengthy analysis done until now, but a few low-hanging fruits that might help:

  • Both timetable and register objects should be re-modelled into polymorphic models — all lesosn objects should have a common parent class, so we do not have to join over a row of semi-identical tables.
  • We should get rid of empty personal notes (#134)
  • Limit returned fields to those that are needed — most importantly, get everything but id out of the DISTINCT query

Additionally, a hint from credativ DB team:

  • (U11."group_id" = 5856 OR U13."to_group_id" = 5856 OR U15."group_id" = 5856 OR U17."to_group_id" = 5856 OR U19."group_id" = 5856 OR U21."to_group_id" = 5856) should probably be part of the LEFT OUTER JOIN conditions further up (same for school_term)
No lengthy analysis done until now, but a few low-hanging fruits that **might** help: * Both timetable and register objects should be re-modelled into polymorphic models — all lesosn objects should have a common parent class, so we do not have to join over a row of semi-identical tables. * We should get rid of empty personal notes (#134) * Limit returned fields to those that are needed — most importantly, get everything but `id` out of the `DISTINCT` query Additionally, a hint from credativ DB team: * `(U11."group_id" = 5856 OR U13."to_group_id" = 5856 OR U15."group_id" = 5856 OR U17."to_group_id" = 5856 OR U19."group_id" = 5856 OR U21."to_group_id" = 5856)` should probably be part of the `LEFT OUTER JOIN` conditions further up (same for `school_term`)
Owner
https://explain.depesz.com/s/qFim
Owner
https://docs.djangoproject.com/en/3.1/ref/models/querysets/#filteredrelation-objects might be of some help
Owner
https://docs.djangoproject.com/en/3.1/ref/models/querysets/#django.db.models.query.QuerySet.only as well
Owner

Moving the most of the WHERE clause into the joins gives us an improvement of (only) a few seconds:

https://explain.depesz.com/s/6ziN

--- foo.sql     2021-03-18 12:52:18.177894411 +0100
+++ foo2.sql    2021-03-18 14:34:54.184927744 +0100
@@ -1,3 +1,4 @@
+EXPLAIN (ANALYZE, VERBOSE, BUFFERS)
 SELECT DISTINCT "core_person"."id",
        "core_person"."site_id",
        "core_person"."extended_data",
@@ -32,30 +33,30 @@
           LEFT OUTER JOIN "chronos_lesson" U4
             ON (U3."lesson_id" = U4."id")
           LEFT OUTER JOIN "chronos_validityrange" U5
-            ON (U4."validity_id" = U5."id")
+            ON (U4."validity_id" = U5."id" AND U5."school_term_id" = 2)
           LEFT OUTER JOIN "chronos_extralesson" U7
-            ON (U2."extra_lesson_id" = U7."id")
+            ON (U2."extra_lesson_id" = U7."id" AND U5."school_term_id" = 2)
           LEFT OUTER JOIN "chronos_event" U9
-            ON (U2."event_id" = U9."id")
+            ON (U2."event_id" = U9."id" AND U5."school_term_id" = 2)
           LEFT OUTER JOIN "chronos_lesson_groups" U11
-            ON (U4."id" = U11."lesson_id")
+            ON (U4."id" = U11."lesson_id" AND U11."group_id" = 5856)
           LEFT OUTER JOIN "core_group" U12
             ON (U11."group_id" = U12."id")
           LEFT OUTER JOIN "core_group_parent_groups" U13
-            ON (U12."id" = U13."from_group_id")
+            ON (U12."id" = U13."from_group_id" AND U13."to_group_id" = 5856)
           LEFT OUTER JOIN "chronos_extralesson_groups" U15
-            ON (U7."id" = U15."extralesson_id")
+            ON (U7."id" = U15."extralesson_id" AND U15."group_id" = 5856)
           LEFT OUTER JOIN "core_group" U16
             ON (U15."group_id" = U16."id")
           LEFT OUTER JOIN "core_group_parent_groups" U17
-            ON (U16."id" = U17."from_group_id")
+            ON (U16."id" = U17."from_group_id" AND U17."to_group_id" = 5856)
           LEFT OUTER JOIN "chronos_event_groups" U19
-            ON (U9."id" = U19."event_id")
+            ON (U9."id" = U19."event_id" AND U19."group_id" = 5856)
           LEFT OUTER JOIN "core_group" U20
             ON (U19."group_id" = U20."id")
           LEFT OUTER JOIN "core_group_parent_groups" U21
-            ON (U20."id" = U21."from_group_id")
-         WHERE (U0."site_id" = 1 AND (U5."school_term_id" = 2 OR U7."school_term_id" = 2 OR U9."school_term_id" = 2) AND (U11."group_id" = 5856 OR U13."to_group_id" = 5856 OR U15."group_id" = 5856 OR U17."to_group_id" = 5856 OR U19."group_id" = 5856 OR U21."to_group_id" = 5856) AND U0."id" = "core_person"."id")
+            ON (U20."id" = U21."from_group_id" AND U21."to_group_id" = 5856)
+         WHERE (U0."site_id" = 1 AND U0."id" = "core_person"."id")
          GROUP BY U0."id"
        ) AS "tardiness",
        COUNT(DISTINCT T8."id") FILTER (WHERE (NOT (T8."late" = 0 AND T8."late" IS NOT NULL) AND ("chronos_validityrange"."school_term_id" = 2 OR "chronos_extralesson"."school_term_id" = 2 OR "chronos_event"."school_term_id" = 2) AND ("chronos_lesson_groups"."group_id" = 5856 OR "core_group_parent_groups"."to_group_id" = 5856 OR "chronos_extralesson_groups"."group_id" = 5856 OR T23."to_group_id" = 5856 OR "chronos_event_groups"."group_id" = 5856 OR T27."to_group_id" = 5856))) AS "tardiness_count",
Moving the most of the `WHERE` clause into the joins gives us an improvement of (only) a few seconds: https://explain.depesz.com/s/6ziN ```diff --- foo.sql 2021-03-18 12:52:18.177894411 +0100 +++ foo2.sql 2021-03-18 14:34:54.184927744 +0100 @@ -1,3 +1,4 @@ +EXPLAIN (ANALYZE, VERBOSE, BUFFERS) SELECT DISTINCT "core_person"."id", "core_person"."site_id", "core_person"."extended_data", @@ -32,30 +33,30 @@ LEFT OUTER JOIN "chronos_lesson" U4 ON (U3."lesson_id" = U4."id") LEFT OUTER JOIN "chronos_validityrange" U5 - ON (U4."validity_id" = U5."id") + ON (U4."validity_id" = U5."id" AND U5."school_term_id" = 2) LEFT OUTER JOIN "chronos_extralesson" U7 - ON (U2."extra_lesson_id" = U7."id") + ON (U2."extra_lesson_id" = U7."id" AND U5."school_term_id" = 2) LEFT OUTER JOIN "chronos_event" U9 - ON (U2."event_id" = U9."id") + ON (U2."event_id" = U9."id" AND U5."school_term_id" = 2) LEFT OUTER JOIN "chronos_lesson_groups" U11 - ON (U4."id" = U11."lesson_id") + ON (U4."id" = U11."lesson_id" AND U11."group_id" = 5856) LEFT OUTER JOIN "core_group" U12 ON (U11."group_id" = U12."id") LEFT OUTER JOIN "core_group_parent_groups" U13 - ON (U12."id" = U13."from_group_id") + ON (U12."id" = U13."from_group_id" AND U13."to_group_id" = 5856) LEFT OUTER JOIN "chronos_extralesson_groups" U15 - ON (U7."id" = U15."extralesson_id") + ON (U7."id" = U15."extralesson_id" AND U15."group_id" = 5856) LEFT OUTER JOIN "core_group" U16 ON (U15."group_id" = U16."id") LEFT OUTER JOIN "core_group_parent_groups" U17 - ON (U16."id" = U17."from_group_id") + ON (U16."id" = U17."from_group_id" AND U17."to_group_id" = 5856) LEFT OUTER JOIN "chronos_event_groups" U19 - ON (U9."id" = U19."event_id") + ON (U9."id" = U19."event_id" AND U19."group_id" = 5856) LEFT OUTER JOIN "core_group" U20 ON (U19."group_id" = U20."id") LEFT OUTER JOIN "core_group_parent_groups" U21 - ON (U20."id" = U21."from_group_id") - WHERE (U0."site_id" = 1 AND (U5."school_term_id" = 2 OR U7."school_term_id" = 2 OR U9."school_term_id" = 2) AND (U11."group_id" = 5856 OR U13."to_group_id" = 5856 OR U15."group_id" = 5856 OR U17."to_group_id" = 5856 OR U19."group_id" = 5856 OR U21."to_group_id" = 5856) AND U0."id" = "core_person"."id") + ON (U20."id" = U21."from_group_id" AND U21."to_group_id" = 5856) + WHERE (U0."site_id" = 1 AND U0."id" = "core_person"."id") GROUP BY U0."id" ) AS "tardiness", COUNT(DISTINCT T8."id") FILTER (WHERE (NOT (T8."late" = 0 AND T8."late" IS NOT NULL) AND ("chronos_validityrange"."school_term_id" = 2 OR "chronos_extralesson"."school_term_id" = 2 OR "chronos_event"."school_term_id" = 2) AND ("chronos_lesson_groups"."group_id" = 5856 OR "core_group_parent_groups"."to_group_id" = 5856 OR "chronos_extralesson_groups"."group_id" = 5856 OR T23."to_group_id" = 5856 OR "chronos_event_groups"."group_id" = 5856 OR T27."to_group_id" = 5856))) AS "tardiness_count", ```
Author
Owner
The query is executed in https://edugit.org/AlekSIS/official/AlekSIS-App-Alsijil/-/blob/master/aleksis/apps/alsijil/model_extensions.py#L382.
Author
Owner

assigned to @hansegucker

assigned to @hansegucker
Author
Owner

created merge request !552 to address this issue

created merge request !552 to address this issue
Author
Owner

mentioned in merge request !552

mentioned in merge request !552
Owner

mentioned in commit f6a1b81731

mentioned in commit f6a1b81731110ad9dbba53de18f31c8ec50a58fc
nik closed this issue 2021-03-18 23:02:40 +01:00
Owner

For documentation, here's the query after !552, and its plan:

SELECT "core_person"."id",
       "core_person"."site_id",
       "core_person"."extended_data",
       "core_person"."user_id",
       "core_person"."is_active",
       "core_person"."first_name",
       "core_person"."last_name",
       "core_person"."additional_name",
       "core_person"."short_name",
       "core_person"."street",
       "core_person"."housenumber",
       "core_person"."postal_code",
       "core_person"."place",
       "core_person"."phone_number",
       "core_person"."mobile_number",
       "core_person"."email",
       "core_person"."date_of_birth",
       "core_person"."sex",
       "core_person"."photo",
       "core_person"."primary_group_id",
       "core_person"."description",
       COUNT(filtered_personal_notes."id") FILTER (
                                                   WHERE filtered_personal_notes."absent") AS "absences_count",
       COUNT(filtered_personal_notes."id") FILTER (
                                                   WHERE (filtered_personal_notes."absent"
                                                          AND filtered_personal_notes."excuse_type_id" IS NULL
                                                          AND filtered_personal_notes."excused")) AS "excused",
       COUNT(filtered_personal_notes."id") FILTER (
                                                   WHERE (filtered_personal_notes."absent"
                                                          AND NOT filtered_personal_notes."excused")) AS "unexcused",
       SUM(filtered_personal_notes."late") AS "tardiness",
       COUNT(filtered_personal_notes."id") FILTER (
                                                   WHERE filtered_personal_notes."late" > 0) AS "tardiness_count",
       COUNT(filtered_personal_notes."id") FILTER (
                                                   WHERE "alsijil_personalnote_extra_marks"."extramark_id" = 1) AS "HA_count",
       COUNT(filtered_personal_notes."absent") FILTER (
                                                       WHERE (filtered_personal_notes."absent"
                                                              AND filtered_personal_notes."excuse_type_id" = 1)) AS "s_count"
FROM "core_person"
INNER JOIN "core_persongroupthrough" ON ("core_person"."id" = "core_persongroupthrough"."person_id")
LEFT OUTER JOIN "alsijil_personalnote" filtered_personal_notes ON ("core_person"."id" = filtered_personal_notes."person_id"
                                                                   AND ((filtered_personal_notes."event_id" IN
                                                                           (SELECT U0."id"
                                                                            FROM "chronos_event" U0
                                                                            INNER JOIN "chronos_event_groups" U3 ON (U0."id" = U3."event_id")
                                                                            INNER JOIN "core_group" U4 ON (U3."group_id" = U4."id")
                                                                            LEFT OUTER JOIN "core_group_parent_groups" U5 ON (U4."id" = U5."from_group_id")
                                                                            WHERE (U0."site_id" = 1
                                                                                   AND U0."school_term_id" = 2
                                                                                   AND (U3."group_id" = 5849
                                                                                        OR U5."to_group_id" = 5849)))
                                                                         OR filtered_personal_notes."lesson_period_id" IN
                                                                           (SELECT U0."id"
                                                                            FROM "chronos_lessonperiod" U0
                                                                            INNER JOIN "chronos_lesson" U2 ON (U0."lesson_id" = U2."id")
                                                                            INNER JOIN "chronos_validityrange" U3 ON (U2."validity_id" = U3."id")
                                                                            INNER JOIN "chronos_lesson_groups" U5 ON (U2."id" = U5."lesson_id")
                                                                            INNER JOIN "core_group" U6 ON (U5."group_id" = U6."id")
                                                                            LEFT OUTER JOIN "core_group_parent_groups" U7 ON (U6."id" = U7."from_group_id")
                                                                            WHERE (U0."site_id" = 1
                                                                                   AND U3."school_term_id" = 2
                                                                                   AND (U5."group_id" = 5849
                                                                                        OR U7."to_group_id" = 5849)))
                                                                         OR filtered_personal_notes."extra_lesson_id" IN
                                                                           (SELECT U0."id"
                                                                            FROM "chronos_extralesson" U0
                                                                            INNER JOIN "chronos_extralesson_groups" U3 ON (U0."id" = U3."extralesson_id")
                                                                            INNER JOIN "core_group" U4 ON (U3."group_id" = U4."id")
                                                                            LEFT OUTER JOIN "core_group_parent_groups" U5 ON (U4."id" = U5."from_group_id")
                                                                            WHERE (U0."site_id" = 1
                                                                                   AND U0."school_term_id" = 2
                                                                                   AND (U3."group_id" = 5849
                                                                                        OR U5."to_group_id" = 5849))))))
LEFT OUTER JOIN "alsijil_personalnote_extra_marks" ON (filtered_personal_notes."id" = "alsijil_personalnote_extra_marks"."personalnote_id")
WHERE ("core_person"."site_id" = 1
       AND "core_persongroupthrough"."group_id" = 5849)
GROUP BY "core_person"."id"
 HashAggregate  (cost=2841.27..2866.31 rows=2504 width=210) (actual time=46.576..46.657 rows=30 loops=1)
   Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, count(filtered_personal_notes.id) FILTER (WHERE filtered_personal_notes.absent), count(filtered_personal_notes.id) FILTER (WHERE (filtered_personal_notes.absent AND (filtered_personal_notes.excuse_type_id IS NULL) AND filtered_personal_notes.excused)), count(filtered_personal_notes.id) FILTER (WHERE (filtered_personal_notes.absent AND (NOT filtered_personal_notes.excused))), sum(filtered_personal_notes.late), count(filtered_personal_notes.id) FILTER (WHERE (filtered_personal_notes.late > 0)), count(filtered_personal_notes.id) FILTER (WHERE (alsijil_personalnote_extra_marks.extramark_id = 1)), count(filtered_personal_notes.absent) FILTER (WHERE (filtered_personal_notes.absent AND (filtered_personal_notes.excuse_type_id = 1)))
   Group Key: core_person.id
   Batches: 1  Memory Usage: 145kB
   Buffers: shared hit=18020
   ->  Nested Loop Left Join  (cost=583.82..2691.09 rows=5461 width=170) (actual time=9.995..45.424 rows=4212 loops=1)
         Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, filtered_personal_notes.id, filtered_personal_notes.absent, filtered_personal_notes.excuse_type_id, filtered_personal_notes.excused, filtered_personal_notes.late, alsijil_personalnote_extra_marks.extramark_id
         Buffers: shared hit=18020
         ->  Hash Join  (cost=120.89..173.95 rows=30 width=154) (actual time=2.427..2.592 rows=30 loops=1)
               Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description
               Inner Unique: true
               Hash Cond: (core_persongroupthrough.person_id = core_person.id)
               Buffers: shared hit=83
               ->  Index Scan using core_persongroupthrough_group_id_62316e93 on public.core_persongroupthrough  (cost=0.29..53.27 rows=30 width=4) (actual time=0.024..0.133 rows=30 loops=1)
                     Output: core_persongroupthrough.id, core_persongroupthrough.extended_data, core_persongroupthrough.group_id, core_persongroupthrough.person_id, core_persongroupthrough.site_id
                     Index Cond: (core_persongroupthrough.group_id = 5849)
                     Buffers: shared hit=25
               ->  Hash  (cost=89.30..89.30 rows=2504 width=154) (actual time=2.364..2.365 rows=2504 loops=1)
                     Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description
                     Buckets: 4096  Batches: 1  Memory Usage: 492kB
                     Buffers: shared hit=58
                     ->  Seq Scan on public.core_person  (cost=0.00..89.30 rows=2504 width=154) (actual time=0.012..0.985 rows=2504 loops=1)
                           Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description
                           Filter: (core_person.site_id = 1)
                           Buffers: shared hit=58
         ->  Hash Right Join  (cost=462.93..526.00 rows=540 width=20) (actual time=1.338..1.398 rows=140 loops=30)
               Output: filtered_personal_notes.id, filtered_personal_notes.absent, filtered_personal_notes.excuse_type_id, filtered_personal_notes.excused, filtered_personal_notes.late, filtered_personal_notes.person_id, alsijil_personalnote_extra_marks.extramark_id
               Inner Unique: true
               Hash Cond: (alsijil_personalnote_extra_marks.personalnote_id = filtered_personal_notes.id)
               Buffers: shared hit=17937
               ->  Seq Scan on public.alsijil_personalnote_extra_marks  (cost=0.00..53.91 rows=3491 width=8) (actual time=0.002..0.263 rows=3491 loops=30)
                     Output: alsijil_personalnote_extra_marks.id, alsijil_personalnote_extra_marks.personalnote_id, alsijil_personalnote_extra_marks.extramark_id
                     Buffers: shared hit=570
               ->  Hash  (cost=456.18..456.18 rows=540 width=16) (actual time=0.751..0.751 rows=140 loops=30)
                     Output: filtered_personal_notes.id, filtered_personal_notes.absent, filtered_personal_notes.excuse_type_id, filtered_personal_notes.excused, filtered_personal_notes.late, filtered_personal_notes.person_id
                     Buckets: 1024  Batches: 1  Memory Usage: 16kB
                     Buffers: shared hit=17367
                     ->  Index Scan using alsijil_personalnote_person_id_35fbe0f4 on public.alsijil_personalnote filtered_personal_notes  (cost=432.21..456.18 rows=540 width=16) (actual time=0.607..0.724 rows=140 loops=30)
                           Output: filtered_personal_notes.id, filtered_personal_notes.absent, filtered_personal_notes.excuse_type_id, filtered_personal_notes.excused, filtered_personal_notes.late, filtered_personal_notes.person_id
                           Index Cond: (filtered_personal_notes.person_id = core_person.id)
                           Filter: ((hashed SubPlan 1) OR (hashed SubPlan 2) OR (hashed SubPlan 3))
                           Rows Removed by Filter: 502
                           Buffers: shared hit=17367
                           SubPlan 1
                             ->  Nested Loop Left Join  (cost=0.56..4.94 rows=1 width=4) (actual time=0.108..0.112 rows=0 loops=1)
                                   Output: u0.id
                                   Filter: ((u3.group_id = 5849) OR (u5.to_group_id = 5849))
                                   Rows Removed by Filter: 2
                                   Buffers: shared hit=19
                                   ->  Nested Loop  (cost=0.28..4.53 rows=1 width=12) (actual time=0.049..0.086 rows=2 loops=1)
                                         Output: u0.id, u3.group_id, u4.id
                                         Inner Unique: true
                                         Buffers: shared hit=15
                                         ->  Nested Loop  (cost=0.00..2.82 rows=1 width=8) (actual time=0.027..0.061 rows=2 loops=1)
                                               Output: u0.id, u3.group_id
                                               Join Filter: (u0.id = u3.event_id)
                                               Rows Removed by Join Filter: 151
                                               Buffers: shared hit=10
                                               ->  Seq Scan on public.chronos_event u0  (cost=0.00..1.44 rows=1 width=4) (actual time=0.010..0.012 rows=9 loops=1)
                                                     Output: u0.id, u0.extended_data, u0.title, u0.date_start, u0.date_end, u0.period_from_id, u0.period_to_id, u0.site_id, u0.school_term_id
                                                     Filter: ((u0.site_id = 1) AND (u0.school_term_id = 2))
                                                     Rows Removed by Filter: 20
                                                     Buffers: shared hit=1
                                               ->  Seq Scan on public.chronos_event_groups u3  (cost=0.00..1.17 rows=17 width=8) (actual time=0.001..0.003 rows=17 loops=9)
                                                     Output: u3.id, u3.event_id, u3.group_id
                                                     Buffers: shared hit=9
                                         ->  Index Only Scan using core_group_pkey on public.core_group u4  (cost=0.28..1.71 rows=1 width=4) (actual time=0.010..0.011 rows=1 loops=2)
                                               Output: u4.id
                                               Index Cond: (u4.id = u3.group_id)
                                               Heap Fetches: 0
                                               Buffers: shared hit=5
                                   ->  Index Only Scan using core_group_parent_groups_from_group_id_to_group_i_cfd5deea_uniq on public.core_group_parent_groups u5  (cost=0.28..0.37 rows=3 width=8) (actual time=0.011..0.011 rows=0 loops=2)
                                         Output: u5.from_group_id, u5.to_group_id
                                         Index Cond: (u5.from_group_id = u4.id)
                                         Heap Fetches: 0
                                         Buffers: shared hit=4
                           SubPlan 2
                             ->  Nested Loop  (cost=91.12..410.43 rows=47 width=4) (actual time=1.695..4.885 rows=78 loops=1)
                                   Output: u0_1.id
                                   Buffers: shared hit=2471
                                   ->  Nested Loop Left Join  (cost=90.84..400.69 rows=21 width=8) (actual time=1.662..4.725 rows=36 loops=1)
                                         Output: u2.id, u5_1.lesson_id
                                         Filter: ((u5_1.group_id = 5849) OR (u7.to_group_id = 5849))
                                         Rows Removed by Filter: 1632
                                         Buffers: shared hit=2361
                                         ->  Hash Join  (cost=90.56..198.89 rows=484 width=16) (actual time=1.304..2.980 rows=1142 loops=1)
                                               Output: u2.id, u5_1.lesson_id, u5_1.group_id, u6.id
                                               Inner Unique: true
                                               Hash Cond: (u5_1.group_id = u6.id)
                                               Buffers: shared hit=76
                                               ->  Hash Join  (cost=42.17..149.23 rows=484 width=12) (actual time=0.846..2.215 rows=1142 loops=1)
                                                     Output: u2.id, u5_1.lesson_id, u5_1.group_id
                                                     Hash Cond: (u5_1.lesson_id = u2.id)
                                                     Buffers: shared hit=55
                                                     ->  Seq Scan on public.chronos_lesson_groups u5_1  (cost=0.00..82.25 rows=5325 width=8) (actual time=0.005..0.500 rows=5325 loops=1)
                                                           Output: u5_1.id, u5_1.lesson_id, u5_1.group_id
                                                           Buffers: shared hit=29
                                                     ->  Hash  (cost=34.74..34.74 rows=595 width=4) (actual time=0.674..0.676 rows=1142 loops=1)
                                                           Output: u2.id
                                                           Buckets: 2048 (originally 1024)  Batches: 1 (originally 1)  Memory Usage: 57kB
                                                           Buffers: shared hit=26
                                                           ->  Nested Loop  (cost=0.28..34.74 rows=595 width=4) (actual time=0.025..0.459 rows=1142 loops=1)
                                                                 Output: u2.id
                                                                 Buffers: shared hit=26
                                                                 ->  Seq Scan on public.chronos_validityrange u3_1  (cost=0.00..1.14 rows=1 width=4) (actual time=0.006..0.007 rows=2 loops=1)
                                                                       Output: u3_1.id, u3_1.extended_data, u3_1.name, u3_1.date_start, u3_1.date_end, u3_1.school_term_id, u3_1.site_id
                                                                       Filter: (u3_1.school_term_id = 2)
                                                                       Rows Removed by Filter: 9
                                                                       Buffers: shared hit=1
                                                                 ->  Index Scan using chronos_lesson_validity_id_da417884 on public.chronos_lesson u2  (cost=0.28..27.65 rows=595 width=8) (actual time=0.010..0.154 rows=571 loops=2)
                                                                       Output: u2.id, u2.extended_data, u2.site_id, u2.subject_id, u2.validity_id
                                                                       Index Cond: (u2.validity_id = u3_1.id)
                                                                       Buffers: shared hit=25
                                               ->  Hash  (cost=33.17..33.17 rows=1217 width=4) (actual time=0.438..0.439 rows=1217 loops=1)
                                                     Output: u6.id
                                                     Buckets: 2048  Batches: 1  Memory Usage: 59kB
                                                     Buffers: shared hit=21
                                                     ->  Seq Scan on public.core_group u6  (cost=0.00..33.17 rows=1217 width=4) (actual time=0.007..0.215 rows=1217 loops=1)
                                                           Output: u6.id
                                                           Buffers: shared hit=21
                                         ->  Index Only Scan using core_group_parent_groups_from_group_id_to_group_i_cfd5deea_uniq on public.core_group_parent_groups u7  (cost=0.28..0.37 rows=3 width=8) (actual time=0.001..0.001 rows=1 loops=1142)
                                               Output: u7.from_group_id, u7.to_group_id
                                               Index Cond: (u7.from_group_id = u6.id)
                                               Heap Fetches: 0
                                               Buffers: shared hit=2285
                                   ->  Index Scan using chronos_lessonperiod_lesson_id_daa368e9 on public.chronos_lessonperiod u0_1  (cost=0.29..0.44 rows=2 width=8) (actual time=0.003..0.004 rows=2 loops=36)
                                         Output: u0_1.id, u0_1.extended_data, u0_1.lesson_id, u0_1.period_id, u0_1.room_id, u0_1.site_id
                                         Index Cond: (u0_1.lesson_id = u2.id)
                                         Filter: (u0_1.site_id = 1)
                                         Buffers: shared hit=110
                           SubPlan 3
                             ->  Nested Loop Left Join  (cost=0.56..16.29 rows=1 width=4) (actual time=0.049..0.051 rows=0 loops=1)
                                   Output: u0_2.id
                                   Filter: ((u3_2.group_id = 5849) OR (u5_2.to_group_id = 5849))
                                   Buffers: shared hit=4
                                   ->  Nested Loop  (cost=0.28..15.87 rows=1 width=12) (actual time=0.049..0.050 rows=0 loops=1)
                                         Output: u0_2.id, u3_2.group_id, u4_1.id
                                         Inner Unique: true
                                         Buffers: shared hit=4
                                         ->  Nested Loop  (cost=0.00..15.49 rows=1 width=8) (actual time=0.048..0.050 rows=0 loops=1)
                                               Output: u0_2.id, u3_2.group_id
                                               Join Filter: (u0_2.id = u3_2.extralesson_id)
                                               Buffers: shared hit=4
                                               ->  Seq Scan on public.chronos_extralesson u0_2  (cost=0.00..7.53 rows=1 width=4) (actual time=0.048..0.049 rows=0 loops=1)
                                                     Output: u0_2.id, u0_2.extended_data, u0_2.week, u0_2.comment, u0_2.period_id, u0_2.room_id, u0_2.site_id, u0_2.subject_id, u0_2.school_term_id, u0_2.year
                                                     Filter: ((u0_2.site_id = 1) AND (u0_2.school_term_id = 2))
                                                     Rows Removed by Filter: 235
                                                     Buffers: shared hit=4
                                               ->  Seq Scan on public.chronos_extralesson_groups u3_2  (cost=0.00..4.65 rows=265 width=8) (never executed)
                                                     Output: u3_2.id, u3_2.extralesson_id, u3_2.group_id
                                         ->  Index Only Scan using core_group_pkey on public.core_group u4_1  (cost=0.28..0.39 rows=1 width=4) (never executed)
                                               Output: u4_1.id
                                               Index Cond: (u4_1.id = u3_2.group_id)
                                               Heap Fetches: 0
                                   ->  Index Only Scan using core_group_parent_groups_from_group_id_to_group_i_cfd5deea_uniq on public.core_group_parent_groups u5_2  (cost=0.28..0.37 rows=3 width=8) (never executed)
                                         Output: u5_2.from_group_id, u5_2.to_group_id
                                         Index Cond: (u5_2.from_group_id = u4_1.id)
                                         Heap Fetches: 0
 Planning:
   Buffers: shared hit=1555
 Planning Time: 10.385 ms
 Execution Time: 47.376 ms

Execution time went down from ~24,000ms to ~40ms.

For documentation, here's the query after !552, and its plan: ```sql SELECT "core_person"."id", "core_person"."site_id", "core_person"."extended_data", "core_person"."user_id", "core_person"."is_active", "core_person"."first_name", "core_person"."last_name", "core_person"."additional_name", "core_person"."short_name", "core_person"."street", "core_person"."housenumber", "core_person"."postal_code", "core_person"."place", "core_person"."phone_number", "core_person"."mobile_number", "core_person"."email", "core_person"."date_of_birth", "core_person"."sex", "core_person"."photo", "core_person"."primary_group_id", "core_person"."description", COUNT(filtered_personal_notes."id") FILTER ( WHERE filtered_personal_notes."absent") AS "absences_count", COUNT(filtered_personal_notes."id") FILTER ( WHERE (filtered_personal_notes."absent" AND filtered_personal_notes."excuse_type_id" IS NULL AND filtered_personal_notes."excused")) AS "excused", COUNT(filtered_personal_notes."id") FILTER ( WHERE (filtered_personal_notes."absent" AND NOT filtered_personal_notes."excused")) AS "unexcused", SUM(filtered_personal_notes."late") AS "tardiness", COUNT(filtered_personal_notes."id") FILTER ( WHERE filtered_personal_notes."late" > 0) AS "tardiness_count", COUNT(filtered_personal_notes."id") FILTER ( WHERE "alsijil_personalnote_extra_marks"."extramark_id" = 1) AS "HA_count", COUNT(filtered_personal_notes."absent") FILTER ( WHERE (filtered_personal_notes."absent" AND filtered_personal_notes."excuse_type_id" = 1)) AS "s_count" FROM "core_person" INNER JOIN "core_persongroupthrough" ON ("core_person"."id" = "core_persongroupthrough"."person_id") LEFT OUTER JOIN "alsijil_personalnote" filtered_personal_notes ON ("core_person"."id" = filtered_personal_notes."person_id" AND ((filtered_personal_notes."event_id" IN (SELECT U0."id" FROM "chronos_event" U0 INNER JOIN "chronos_event_groups" U3 ON (U0."id" = U3."event_id") INNER JOIN "core_group" U4 ON (U3."group_id" = U4."id") LEFT OUTER JOIN "core_group_parent_groups" U5 ON (U4."id" = U5."from_group_id") WHERE (U0."site_id" = 1 AND U0."school_term_id" = 2 AND (U3."group_id" = 5849 OR U5."to_group_id" = 5849))) OR filtered_personal_notes."lesson_period_id" IN (SELECT U0."id" FROM "chronos_lessonperiod" U0 INNER JOIN "chronos_lesson" U2 ON (U0."lesson_id" = U2."id") INNER JOIN "chronos_validityrange" U3 ON (U2."validity_id" = U3."id") INNER JOIN "chronos_lesson_groups" U5 ON (U2."id" = U5."lesson_id") INNER JOIN "core_group" U6 ON (U5."group_id" = U6."id") LEFT OUTER JOIN "core_group_parent_groups" U7 ON (U6."id" = U7."from_group_id") WHERE (U0."site_id" = 1 AND U3."school_term_id" = 2 AND (U5."group_id" = 5849 OR U7."to_group_id" = 5849))) OR filtered_personal_notes."extra_lesson_id" IN (SELECT U0."id" FROM "chronos_extralesson" U0 INNER JOIN "chronos_extralesson_groups" U3 ON (U0."id" = U3."extralesson_id") INNER JOIN "core_group" U4 ON (U3."group_id" = U4."id") LEFT OUTER JOIN "core_group_parent_groups" U5 ON (U4."id" = U5."from_group_id") WHERE (U0."site_id" = 1 AND U0."school_term_id" = 2 AND (U3."group_id" = 5849 OR U5."to_group_id" = 5849)))))) LEFT OUTER JOIN "alsijil_personalnote_extra_marks" ON (filtered_personal_notes."id" = "alsijil_personalnote_extra_marks"."personalnote_id") WHERE ("core_person"."site_id" = 1 AND "core_persongroupthrough"."group_id" = 5849) GROUP BY "core_person"."id" ``` ```plain HashAggregate (cost=2841.27..2866.31 rows=2504 width=210) (actual time=46.576..46.657 rows=30 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, count(filtered_personal_notes.id) FILTER (WHERE filtered_personal_notes.absent), count(filtered_personal_notes.id) FILTER (WHERE (filtered_personal_notes.absent AND (filtered_personal_notes.excuse_type_id IS NULL) AND filtered_personal_notes.excused)), count(filtered_personal_notes.id) FILTER (WHERE (filtered_personal_notes.absent AND (NOT filtered_personal_notes.excused))), sum(filtered_personal_notes.late), count(filtered_personal_notes.id) FILTER (WHERE (filtered_personal_notes.late > 0)), count(filtered_personal_notes.id) FILTER (WHERE (alsijil_personalnote_extra_marks.extramark_id = 1)), count(filtered_personal_notes.absent) FILTER (WHERE (filtered_personal_notes.absent AND (filtered_personal_notes.excuse_type_id = 1))) Group Key: core_person.id Batches: 1 Memory Usage: 145kB Buffers: shared hit=18020 -> Nested Loop Left Join (cost=583.82..2691.09 rows=5461 width=170) (actual time=9.995..45.424 rows=4212 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description, filtered_personal_notes.id, filtered_personal_notes.absent, filtered_personal_notes.excuse_type_id, filtered_personal_notes.excused, filtered_personal_notes.late, alsijil_personalnote_extra_marks.extramark_id Buffers: shared hit=18020 -> Hash Join (cost=120.89..173.95 rows=30 width=154) (actual time=2.427..2.592 rows=30 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description Inner Unique: true Hash Cond: (core_persongroupthrough.person_id = core_person.id) Buffers: shared hit=83 -> Index Scan using core_persongroupthrough_group_id_62316e93 on public.core_persongroupthrough (cost=0.29..53.27 rows=30 width=4) (actual time=0.024..0.133 rows=30 loops=1) Output: core_persongroupthrough.id, core_persongroupthrough.extended_data, core_persongroupthrough.group_id, core_persongroupthrough.person_id, core_persongroupthrough.site_id Index Cond: (core_persongroupthrough.group_id = 5849) Buffers: shared hit=25 -> Hash (cost=89.30..89.30 rows=2504 width=154) (actual time=2.364..2.365 rows=2504 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description Buckets: 4096 Batches: 1 Memory Usage: 492kB Buffers: shared hit=58 -> Seq Scan on public.core_person (cost=0.00..89.30 rows=2504 width=154) (actual time=0.012..0.985 rows=2504 loops=1) Output: core_person.id, core_person.site_id, core_person.extended_data, core_person.user_id, core_person.is_active, core_person.first_name, core_person.last_name, core_person.additional_name, core_person.short_name, core_person.street, core_person.housenumber, core_person.postal_code, core_person.place, core_person.phone_number, core_person.mobile_number, core_person.email, core_person.date_of_birth, core_person.sex, core_person.photo, core_person.primary_group_id, core_person.description Filter: (core_person.site_id = 1) Buffers: shared hit=58 -> Hash Right Join (cost=462.93..526.00 rows=540 width=20) (actual time=1.338..1.398 rows=140 loops=30) Output: filtered_personal_notes.id, filtered_personal_notes.absent, filtered_personal_notes.excuse_type_id, filtered_personal_notes.excused, filtered_personal_notes.late, filtered_personal_notes.person_id, alsijil_personalnote_extra_marks.extramark_id Inner Unique: true Hash Cond: (alsijil_personalnote_extra_marks.personalnote_id = filtered_personal_notes.id) Buffers: shared hit=17937 -> Seq Scan on public.alsijil_personalnote_extra_marks (cost=0.00..53.91 rows=3491 width=8) (actual time=0.002..0.263 rows=3491 loops=30) Output: alsijil_personalnote_extra_marks.id, alsijil_personalnote_extra_marks.personalnote_id, alsijil_personalnote_extra_marks.extramark_id Buffers: shared hit=570 -> Hash (cost=456.18..456.18 rows=540 width=16) (actual time=0.751..0.751 rows=140 loops=30) Output: filtered_personal_notes.id, filtered_personal_notes.absent, filtered_personal_notes.excuse_type_id, filtered_personal_notes.excused, filtered_personal_notes.late, filtered_personal_notes.person_id Buckets: 1024 Batches: 1 Memory Usage: 16kB Buffers: shared hit=17367 -> Index Scan using alsijil_personalnote_person_id_35fbe0f4 on public.alsijil_personalnote filtered_personal_notes (cost=432.21..456.18 rows=540 width=16) (actual time=0.607..0.724 rows=140 loops=30) Output: filtered_personal_notes.id, filtered_personal_notes.absent, filtered_personal_notes.excuse_type_id, filtered_personal_notes.excused, filtered_personal_notes.late, filtered_personal_notes.person_id Index Cond: (filtered_personal_notes.person_id = core_person.id) Filter: ((hashed SubPlan 1) OR (hashed SubPlan 2) OR (hashed SubPlan 3)) Rows Removed by Filter: 502 Buffers: shared hit=17367 SubPlan 1 -> Nested Loop Left Join (cost=0.56..4.94 rows=1 width=4) (actual time=0.108..0.112 rows=0 loops=1) Output: u0.id Filter: ((u3.group_id = 5849) OR (u5.to_group_id = 5849)) Rows Removed by Filter: 2 Buffers: shared hit=19 -> Nested Loop (cost=0.28..4.53 rows=1 width=12) (actual time=0.049..0.086 rows=2 loops=1) Output: u0.id, u3.group_id, u4.id Inner Unique: true Buffers: shared hit=15 -> Nested Loop (cost=0.00..2.82 rows=1 width=8) (actual time=0.027..0.061 rows=2 loops=1) Output: u0.id, u3.group_id Join Filter: (u0.id = u3.event_id) Rows Removed by Join Filter: 151 Buffers: shared hit=10 -> Seq Scan on public.chronos_event u0 (cost=0.00..1.44 rows=1 width=4) (actual time=0.010..0.012 rows=9 loops=1) Output: u0.id, u0.extended_data, u0.title, u0.date_start, u0.date_end, u0.period_from_id, u0.period_to_id, u0.site_id, u0.school_term_id Filter: ((u0.site_id = 1) AND (u0.school_term_id = 2)) Rows Removed by Filter: 20 Buffers: shared hit=1 -> Seq Scan on public.chronos_event_groups u3 (cost=0.00..1.17 rows=17 width=8) (actual time=0.001..0.003 rows=17 loops=9) Output: u3.id, u3.event_id, u3.group_id Buffers: shared hit=9 -> Index Only Scan using core_group_pkey on public.core_group u4 (cost=0.28..1.71 rows=1 width=4) (actual time=0.010..0.011 rows=1 loops=2) Output: u4.id Index Cond: (u4.id = u3.group_id) Heap Fetches: 0 Buffers: shared hit=5 -> Index Only Scan using core_group_parent_groups_from_group_id_to_group_i_cfd5deea_uniq on public.core_group_parent_groups u5 (cost=0.28..0.37 rows=3 width=8) (actual time=0.011..0.011 rows=0 loops=2) Output: u5.from_group_id, u5.to_group_id Index Cond: (u5.from_group_id = u4.id) Heap Fetches: 0 Buffers: shared hit=4 SubPlan 2 -> Nested Loop (cost=91.12..410.43 rows=47 width=4) (actual time=1.695..4.885 rows=78 loops=1) Output: u0_1.id Buffers: shared hit=2471 -> Nested Loop Left Join (cost=90.84..400.69 rows=21 width=8) (actual time=1.662..4.725 rows=36 loops=1) Output: u2.id, u5_1.lesson_id Filter: ((u5_1.group_id = 5849) OR (u7.to_group_id = 5849)) Rows Removed by Filter: 1632 Buffers: shared hit=2361 -> Hash Join (cost=90.56..198.89 rows=484 width=16) (actual time=1.304..2.980 rows=1142 loops=1) Output: u2.id, u5_1.lesson_id, u5_1.group_id, u6.id Inner Unique: true Hash Cond: (u5_1.group_id = u6.id) Buffers: shared hit=76 -> Hash Join (cost=42.17..149.23 rows=484 width=12) (actual time=0.846..2.215 rows=1142 loops=1) Output: u2.id, u5_1.lesson_id, u5_1.group_id Hash Cond: (u5_1.lesson_id = u2.id) Buffers: shared hit=55 -> Seq Scan on public.chronos_lesson_groups u5_1 (cost=0.00..82.25 rows=5325 width=8) (actual time=0.005..0.500 rows=5325 loops=1) Output: u5_1.id, u5_1.lesson_id, u5_1.group_id Buffers: shared hit=29 -> Hash (cost=34.74..34.74 rows=595 width=4) (actual time=0.674..0.676 rows=1142 loops=1) Output: u2.id Buckets: 2048 (originally 1024) Batches: 1 (originally 1) Memory Usage: 57kB Buffers: shared hit=26 -> Nested Loop (cost=0.28..34.74 rows=595 width=4) (actual time=0.025..0.459 rows=1142 loops=1) Output: u2.id Buffers: shared hit=26 -> Seq Scan on public.chronos_validityrange u3_1 (cost=0.00..1.14 rows=1 width=4) (actual time=0.006..0.007 rows=2 loops=1) Output: u3_1.id, u3_1.extended_data, u3_1.name, u3_1.date_start, u3_1.date_end, u3_1.school_term_id, u3_1.site_id Filter: (u3_1.school_term_id = 2) Rows Removed by Filter: 9 Buffers: shared hit=1 -> Index Scan using chronos_lesson_validity_id_da417884 on public.chronos_lesson u2 (cost=0.28..27.65 rows=595 width=8) (actual time=0.010..0.154 rows=571 loops=2) Output: u2.id, u2.extended_data, u2.site_id, u2.subject_id, u2.validity_id Index Cond: (u2.validity_id = u3_1.id) Buffers: shared hit=25 -> Hash (cost=33.17..33.17 rows=1217 width=4) (actual time=0.438..0.439 rows=1217 loops=1) Output: u6.id Buckets: 2048 Batches: 1 Memory Usage: 59kB Buffers: shared hit=21 -> Seq Scan on public.core_group u6 (cost=0.00..33.17 rows=1217 width=4) (actual time=0.007..0.215 rows=1217 loops=1) Output: u6.id Buffers: shared hit=21 -> Index Only Scan using core_group_parent_groups_from_group_id_to_group_i_cfd5deea_uniq on public.core_group_parent_groups u7 (cost=0.28..0.37 rows=3 width=8) (actual time=0.001..0.001 rows=1 loops=1142) Output: u7.from_group_id, u7.to_group_id Index Cond: (u7.from_group_id = u6.id) Heap Fetches: 0 Buffers: shared hit=2285 -> Index Scan using chronos_lessonperiod_lesson_id_daa368e9 on public.chronos_lessonperiod u0_1 (cost=0.29..0.44 rows=2 width=8) (actual time=0.003..0.004 rows=2 loops=36) Output: u0_1.id, u0_1.extended_data, u0_1.lesson_id, u0_1.period_id, u0_1.room_id, u0_1.site_id Index Cond: (u0_1.lesson_id = u2.id) Filter: (u0_1.site_id = 1) Buffers: shared hit=110 SubPlan 3 -> Nested Loop Left Join (cost=0.56..16.29 rows=1 width=4) (actual time=0.049..0.051 rows=0 loops=1) Output: u0_2.id Filter: ((u3_2.group_id = 5849) OR (u5_2.to_group_id = 5849)) Buffers: shared hit=4 -> Nested Loop (cost=0.28..15.87 rows=1 width=12) (actual time=0.049..0.050 rows=0 loops=1) Output: u0_2.id, u3_2.group_id, u4_1.id Inner Unique: true Buffers: shared hit=4 -> Nested Loop (cost=0.00..15.49 rows=1 width=8) (actual time=0.048..0.050 rows=0 loops=1) Output: u0_2.id, u3_2.group_id Join Filter: (u0_2.id = u3_2.extralesson_id) Buffers: shared hit=4 -> Seq Scan on public.chronos_extralesson u0_2 (cost=0.00..7.53 rows=1 width=4) (actual time=0.048..0.049 rows=0 loops=1) Output: u0_2.id, u0_2.extended_data, u0_2.week, u0_2.comment, u0_2.period_id, u0_2.room_id, u0_2.site_id, u0_2.subject_id, u0_2.school_term_id, u0_2.year Filter: ((u0_2.site_id = 1) AND (u0_2.school_term_id = 2)) Rows Removed by Filter: 235 Buffers: shared hit=4 -> Seq Scan on public.chronos_extralesson_groups u3_2 (cost=0.00..4.65 rows=265 width=8) (never executed) Output: u3_2.id, u3_2.extralesson_id, u3_2.group_id -> Index Only Scan using core_group_pkey on public.core_group u4_1 (cost=0.28..0.39 rows=1 width=4) (never executed) Output: u4_1.id Index Cond: (u4_1.id = u3_2.group_id) Heap Fetches: 0 -> Index Only Scan using core_group_parent_groups_from_group_id_to_group_i_cfd5deea_uniq on public.core_group_parent_groups u5_2 (cost=0.28..0.37 rows=3 width=8) (never executed) Output: u5_2.from_group_id, u5_2.to_group_id Index Cond: (u5_2.from_group_id = u4_1.id) Heap Fetches: 0 Planning: Buffers: shared hit=1555 Planning Time: 10.385 ms Execution Time: 47.376 ms ``` Execution time went down from ~24,000ms to ~40ms.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
aleksis/AlekSIS-App-Alsijil#150
No description provided.