> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-trino-dialect.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# ClickHouse에서 메모리 사용량으로 고비용 쿼리 식별하기

> `system.query_log` 테이블을 사용해 ClickHouse에서 메모리 사용량이 가장 큰 쿼리를 찾는 방법을 클러스터 및 독립형 환경의 예시와 함께 알아봅니다.

<div id="using-the-systemquery-log-table">
  ## `system.query_log` 테이블 사용하기
</div>

다음의 유용한 쿼리는 실행된 쿼리 중 어떤 쿼리가 가장 많은 메모리를 사용했는지 보여줍니다.

이 쿼리에 대해 몇 가지 설명드리면 다음과 같습니다.

* 결과는 지난 1일(`now() - toIntervalDay(1))`)을 기준으로 계산되지만, 시간 인터벌은 쉽게 수정할 수 있습니다
* `default`라는 이름의 클러스터(cluster)가 있다고 가정합니다. 이는 [ClickHouse Cloud](https://console.clickhouse.cloud)에서 사용하는 클러스터 이름입니다. `default`를 클러스터 이름으로 변경하세요
* 클러스터가 없다면 이 문서 끝에 나와 있는 쿼리를 참조하세요

```sql theme={null}
SELECT
    count() as nb_query,
    user,
    query,
    sum(memory_usage) AS memory,
    normalized_query_hash
FROM
    clusterAllReplicas(default, system.query_log)
WHERE
    (event_time >= (now() - toIntervalDay(1)))
    AND is_initial_query = 1
    AND query_kind = 'Select'
    AND type = 'QueryFinish'
    and user != 'monitoring-internal'
GROUP BY
    normalized_query_hash,
    query,
    user
ORDER BY
    memory DESC;
```

응답은 다음과 같습니다:

```response theme={null}
┌─nb_query─┬─user────┬─query─────────────────────────────────────────────────────────┬───memory─┬─normalized_query_hash─┐
│       11 │ default │ select version()                                              │ 46178924 │   7202516440347714159 │
│        2 │ default │ SELECT * FROM "system"."table_functions" LIMIT 31 OFFSET 0    │  8391544 │  12830067173062987695 │
└──────────┴─────────┴───────────────────────────────────────────────────────────────┴──────────┴───────────────────────┘
```

<Note>
  `system.query_log` 테이블이 없다면 쿌리 로깅이 활성화되어 있지 않을 가능성이 높습니다. 활성화 방법에 대한 자세한 내용은 [`query_log` 설정](/ko/reference/settings/server-settings/settings/query#query_log)을 참조하십시오.
</Note>

<Note>
  **`query_log`에는 제출한 쿼리 외의 항목도 포함됩니다**

  제출한 하나의 쿼리가 여러 개의 행으로 나타날 수 있습니다. 즉, 원본 쿼리(`is_initial_query = 1`)와 함께, 분산 실행을 위한 보조 쿼리나 뷰를 평가하는 데 사용되는 내부 쿼리 같은 파생 또는 내부 단계(`is_initial_query = 0`)도 포함됩니다. 이러한 내부 행은 각자 고유한 `query_id` 값을 가지며, 이 값은 ClickHouse가 할당합니다. 경우에 따라 `queryView...`와 같은 레이블이 포함될 수도 있으므로, 모든 `query_id`가 클라이언트가 보고한 값과 일치한다고 가정하지 마십시오. 실제로 실행한 쿼리 기준으로 사용량을 집계하려면 `is_initial_query = 1`로 필터링하거나 `query_id = initial_query_id`에 맞춰 확인하십시오. 자세한 내용은 [가장 비용이 큰 쿼리를 식별하는 방법](/ko/resources/support-center/knowledge-base/performance-optimization/find-expensive-queries#initial_query_id-vs-query_id)과 [`query_log` 참고](/ko/reference/system-tables/query_log)를 참조하십시오.
</Note>

클러스터가 없다면 단일 `system.query_log` 테이블에 직접 쿼리할 수 있습니다:

```sql theme={null}
SELECT
    count() as nb_query,
    user,
    query,
    sum(memory_usage) AS memory,
    normalized_query_hash
FROM
    system.query_log
WHERE
    (event_time >= (now() - toIntervalDay(1)))
    AND is_initial_query = 1
    AND query_kind = 'Select'
    AND type = 'QueryFinish'
    and user != 'monitoring-internal'
GROUP BY
    normalized_query_hash,
    query,
    user
ORDER BY
    memory DESC;
```
