# Discourse에서 느린 쿼리

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

<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:** [5월 25, 2020, 7:13오전 UTC](https://meta.discourse.org/t/slow-queries-in-discourse/152494/11 "2020-05-25T07:13:16Z")

</div>

Discourse에서 스펙을 실행한 결과, Database에서 유사한 쿼리에 비해 느린 쿼리(331729나노초)가 발견되었습니다. 이 쿼리는 불필요한 JOIN을 포함하고 있으며, [ser\_badge.rb#L18](https://github.com/discourse/discourse/blob/61d8955fcb165d2a55760279928306b47fb98898/app/models/user_badge.rb#L18)에서 다음과 같이 생성됩니다:

```plaintext
SELECT 
  COUNT(*) 
FROM 
  "badges" 
  INNER JOIN "user_badges" ON "badges"."id" = "user_badges"."badge_id" 
WHERE 
  "user_badges"."user_id" = 2112 
  AND (
    user_badges.badge_id IN (
      SELECT 
        id 
      FROM 
        badges 
      WHERE 
        enabled
    )
  ) 
  AND "badges"."id" = 1

```

아래와 같이 이 서브쿼리를 `badges.enabled`라는 간단한 조건으로 대체할 수 있습니다:

```plaintext
SELECT 
  COUNT(*) 
FROM 
  "badges" 
  INNER JOIN "user_badges" ON "badges"."id" = "user_badges"."badge_id" 
WHERE 
  "user_badges"."user_id" = 2112 
  AND badges.enabled 
  AND "badges"."id" = 1

```

이 최적화된 쿼리는 267383나노초가 소요되며(19% 개선)됩니다.

---

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