# Query lente in Discourse

**URL:** <https://meta.discourse.org/t/slow-queries-in-discourse/152494>\
**Category:** Development\
**Created:** [24 Maggio 2020, 2:47am UTC](https://meta.discourse.org/t/slow-queries-in-discourse/152494 "2020-05-24T02:47:11Z")\
**Posts on this page:** 1\
**Showing post:** 6

<div class="post-metadata">

**Author:** ![wtune](https://avatars.discourse-cdn.com/v4/letter/w/8dc957/32.png) [@wtune](https://meta.discourse.org/u/wtune)\
**Post date:** [24 Maggio 2020, 4:28am UTC](https://meta.discourse.org/t/slow-queries-in-discourse/152494/6 "2020-05-24T04:28:07Z")

</div>

Dal Database Log rileviamo una query lenta (6064379 nanosecondi) con molte subquery e union generate da [group.rb#L112](https://github.com/discourse/discourse/blob/61d8955fcb165d2a55760279928306b47fb98898/app/models/group.rb#L112), come segue:

```plaintext
SELECT 
  "groups"."id", 
  "groups"."name" 
FROM 
  "groups" 
  INNER JOIN "group_users" ON "groups"."id" = "group_users"."group_id" 
WHERE 
  "group_users"."user_id" = 296 
  AND (groups.id > 0) 
  AND (
    groups.id IN (
      SELECT 
        id 
      FROM 
        groups 
      WHERE 
        visibility_level = 0 
      UNION ALL 
      SELECT 
        id 
      FROM 
        groups 
      WHERE 
        visibility_level = 1 
        AND 296 IS NOT NULL 
      UNION ALL 
      SELECT 
        g.id 
      FROM 
        groups g 
        JOIN group_users gu ON gu.group_id = g.id 
        AND gu.user_id = 296 
      WHERE 
        g.visibility_level = 2 
      UNION ALL 
      SELECT 
        g.id 
      FROM 
        groups g 
        LEFT JOIN group_users gu ON gu.group_id = g.id 
        AND gu.user_id = 296 
        AND gu.owner 
      WHERE 
        g.visibility_level = 3 
        AND (
          gu.id IS NOT NULL 
          OR FALSE
        ) 
      UNION ALL 
      SELECT 
        g.id 
      FROM 
        groups g 
        JOIN group_users gu ON gu.group_id = g.id 
        AND gu.user_id = 296 
        AND gu.owner 
      WHERE 
        g.visibility_level = 4
    )
  ) 
ORDER BY 
  name ASC

```

Ovviamente è equivalente alla query riportata di seguito:

```plaintext
SELECT 
  "groups"."id", 
  "groups"."name" 
FROM 
  "groups" 
  INNER JOIN "group_users" ON "groups"."id" = "group_users"."group_id" 
WHERE 
  "group_users"."user_id" = 296 AND
  groups.visibility_level IN (0, 1, 2, 3, 4) 
ORDER BY 
  name ASC

```

Questa query ottimizzata impiega 378062 nanosecondi (miglioramento del 93%).

---

_[View the full topic](https://meta.discourse.org/t/slow-queries-in-discourse/152494)._
