Query Explain으로 쿼리 실행 분석

이 페이지에서는 쿼리를 실행할 때 쿼리 실행 정보를 가져오는 방법을 설명합니다.

Query Explain 사용

Query Explain을 사용하여 쿼리가 실행되는 방식을 파악할 수 있습니다. 이를 통해 쿼리를 최적화하는 데 사용할 수 있는 세부정보가 제공됩니다.

Google Cloud 콘솔 또는 explain 명령어를 통해 쿼리 설명을 사용할 수 있습니다.

콘솔

쿼리 편집기에서 쿼리를 실행하고 설명 탭을 엽니다.

  1. Google Cloud 콘솔에서 데이터베이스 페이지로 이동합니다.

    데이터베이스로 이동

  2. 데이터베이스 목록에서 MongoDB 호환성을 갖춘 Firestore 데이터베이스를 선택합니다. Google Cloud 콘솔에서 해당 데이터베이스의 Firestore 탐색기가 열립니다.
  3. 쿼리 편집기에 쿼리를 입력하고 실행을 클릭합니다.
  4. 설명 탭을 클릭하여 쿼리 분석 출력을 확인합니다.

    콘솔의 쿼리 설명 탭
Mongo API

Mongo API의 Query Explain은 Mongo Shell 및 Compass와 같은 도구에서 사용할 수 있는 explain 명령어를 통해 지원됩니다.

explain 명령어는 aggregate, find, distinct, count 명령어와 함께 지원됩니다. 예를 들면 다음과 같습니다.

db.collection.explain.find(...)

explain() 메서드를 사용할 수도 있습니다. 예를 들면 다음과 같습니다.

db.collection.find({QUERY}).explain()
제한사항
다음 제한사항과 차이점에 유의하세요.
  • 쿼리 설명은 커서를 반환하는 명령어를 지원하지 않습니다. 예를 들어 다음 명령어를 직접 호출하여 explain을 호출하는 것은 지원되지 않습니다.

    db.collection.aggregate(..., explain: true)
  • Query Explain은 find, aggregate, count, distinct 명령어에서만 지원됩니다.

  • MongoDB API를 통해 쿼리 설명의 VerbosityComment 옵션은 지원되지 않습니다. 이 동작은 executionStats 옵션과 일치합니다. allPlansExecutionqueryPlanner 옵션은 제공되더라도 무시됩니다.

분석

쿼리 설명의 출력에는 요약 통계와 실행 트리라는 두 가지 주요 구성요소가 포함됩니다. 다음 쿼리를 예시로 들어 보겠습니다.

db.order.aggregate(
 [
   { "$match": { "user_id": 1234 } },
   { "$sort": { "date_placed": 1 } }
 ]
)

요약 통계

설명된 출력의 상단에는 실행 통계 요약이 포함되어 있습니다. 이러한 통계를 사용하여 쿼리의 지연 시간 또는 비용이 높은지 확인할 수 있습니다. 또한 쿼리가 메모리 한도에 얼마나 근접했는지 알 수 있는 메모리 통계도 포함되어 있습니다.

Billing Metrics:
read units: 1

Execution Metrics:
request peak memory usage: 4.00 KiB (4,096 B)
results returned: 1

실행 트리

실행 트리는 쿼리 실행을 일련의 노드로 설명합니다. 하단 노드 (리프 노드)는 저장소 레이어에서 데이터를 가져오고, 이 데이터는 트리를 위로 이동하여 쿼리 응답을 생성합니다.

각 실행 노드에 관한 자세한 내용은 실행 참조를 참고하세요.

이 정보를 사용하여 쿼리를 최적화하는 방법에 관한 자세한 내용은 쿼리 실행 최적화를 참고하세요.

다음은 실행 트리의 예입니다.

• Drop
|  fields to drop: [__$3__]
|  records returned: 0
|
└── • MajorSort
    |  fields: [__$3__ ASC]
    |  peak memory usage: 4.00 KiB (4,096 B)
    |  records returned: 0
    |
    └── • Extend
        |  expressions: [date_placed AS __$3__]
        |  records returned: 0
        |
        └── • Drop
            |  fields to drop: [__key__]
            |  records returned: 0
            |
            └── • Extend
                |  expressions: [_id(__key__) AS __id__]
                |  records returned: 0
                |
                └── • Filter
                    |  expression: $eq(user, 1,234)
                    |  records returned: 0
                    |
                    └── • TableScan
                           order: UNDEFINED
                           properties: * - { __create_time__, __update_time__ }
                           records returned: 0
                           records scanned: 0
                           source: (default)#/**/collection

다음 단계