EXPLAIN

지정된 SQL 문에 대한 논리적 실행 계획을 반환합니다.

실행 계획(explain plan)은 Snowflake가 쿼리를 실행하기 위해 수행할 작업(예: 테이블 스캔 및 조인)을 보여줍니다.

참고 항목:

SYSTEM$EXPLAIN_PLAN_JSON , SYSTEM$EXPLAIN_JSON_TO_TEXT , EXPLAIN_JSON

구문

EXPLAIN [ USING { TABULAR | JSON | TEXT } ] <statement>
Copy

매개 변수

statement

실행 계획을 원하는 SQL 문입니다.

USING output_format

이 선택적 절은 출력 형식을 지정합니다. 가능한 출력 형식은 다음과 같습니다.

  • JSON: JSON 출력은 테이블과 쿼리에 더 쉽게 저장할 수 있습니다.

  • TABULAR: 테이블 형식의 출력은 JSON 출력보다 일반적으로 사람이 더 읽기 쉽습니다.

  • TEXT: 서식 있는 텍스트 출력은 JSON 출력보다 일반적으로 사람이 더 읽기 쉽습니다.

기본값은 TABULAR입니다.

출력

출력에는 다음 정보가 포함됩니다.

설명

step

대부분의 쿼리는 단일 단계를 포함하지만, 일부 쿼리는 여러 개의 고유 단계로 실행됩니다. 이 열은 작업이 속한 단계를 나타냅니다.

id

쿼리 계획의 각 작업에 할당된 고유 식별자입니다.

parentOperators

작업의 상위 노드에 대한 식별자로 구성된 배열입니다. 쿼리 프로필에서 부모는 자신과 자식을 연결하는 링크와 함께 자식 위에 표시됩니다.

operation

작업의 이름입니다(예: 결과, 필터, TableScan, 조인 등).

objects

테이블 스캔 작업에서 참조하는 오브젝트의 이름입니다(예: 테이블, 구체화된 뷰 또는 보안 뷰).

alias

쿼리에서 오브젝트에 별칭이 주어진 경우 참조된 오브젝트의 별칭입니다.

expressions

필터, 조인 조건자, 프로젝션, 집계 등과 같은 현재 작업과 관련된 식의 목록입니다.

totalPartitions

참조된 데이터베이스 오브젝트의 총 마이크로 파티션 수입니다.

assignedPartitions

컴파일 시간 잘라내기 후에 남은 참조된 오브젝트의 파티션 수, 즉 쿼리에서 스캔할 수 있는 파티션 수입니다.

assignedBytes

assignPartitions에 포함된 바이트 수입니다.

사용법 노트

  • EXPLAIN은 SQL 문을 컴파일하지만 실행하지는 않으므로, EXPLAIN은 실행 중인 웨어하우스가 필요하지 않습니다.

  • EXPLAIN은 컴퓨팅 크레딧을 사용하지 않지만, 쿼리를 컴파일하면 다른 메타데이터 작업에서 클라우드 서비스 크레딧을 사용하는 것처럼 크레딧을 사용합니다.

  • 이 명령의 출력을 사후 처리하려면 다음 방법으로 수행할 수 있습니다.

    • 쿼리할 수 있는 테이블로 출력을 처리하는 RESULT_SCAN 함수를 사용합니다.

    • JSON 형식으로 출력을 생성하고 나중에 분석할 수 있도록 JSON 형식의 출력을 테이블에 삽입합니다. 출력을 JSON 형식으로 저장하는 경우 SYSTEM$EXPLAIN_JSON_TO_TEXT 또는 EXPLAIN_JSON 함수를 사용하여 JSON을 사람이 더 쉽게 읽을 수 있는 형식(테이블 형식 또는 서식 있는 텍스트)으로 변환할 수 있습니다.

  • assignPartitions 및 assignBytes 값은 쿼리 실행을 위한 상한 추정치입니다. 조인 잘라내기와 같은 런타임 최적화로 쿼리 실행 중에 스캔되는 파티션과 바이트의 수를 줄일 수 있습니다.

  • EXPLAIN 계획은 “논리적” 실행 계획입니다. 수행할 작업과 해당 작업의 상호 간 논리적 관계를 보여줍니다. 계획에 있는 작업의 실제 실행 순서가 계획에서 표시되는 논리적 순서와 반드시 일치하는 것은 아닙니다.

  • EXPLAIN 문의 데이터베이스 오브젝트가 INFORMATION_SCHEMA 오브젝트인 경우 이 문은 EXPLAIN command has insufficient privilege on object <objName> 오류가 발생하며 실패합니다.

다음은 두 개의 작은 테이블에 대한 간단한 쿼리의 EXPLAIN 출력을 보여주는 예입니다.

테이블 만들기:

CREATE TABLE Z1 (ID INTEGER);
CREATE TABLE Z2 (ID INTEGER);
CREATE TABLE Z3 (ID INTEGER);
Copy

쿼리에 대해 테이블 형식으로 EXPLAIN 계획 생성하기:

EXPLAIN USING TABULAR SELECT Z1.ID, Z2.ID 
    FROM Z1, Z2
    WHERE Z2.ID = Z1.ID;
+------+------+-----------------+-------------+------------------------------+-------+--------------------------+-----------------+--------------------+---------------+
| step | id   | parentOperators | operation   | objects                      | alias | expressions              | partitionsTotal | partitionsAssigned | bytesAssigned |
|------+------+-----------------+-------------+------------------------------+-------+--------------------------+-----------------+--------------------+---------------|
| NULL | NULL |            NULL | GlobalStats | NULL                         | NULL  | NULL                     |               2 |                  2 |          1024 |
|    1 |    0 |            NULL | Result      | NULL                         | NULL  | Z1.ID, Z2.ID             |            NULL |               NULL |          NULL |
|    1 |    1 |             [0] | InnerJoin   | NULL                         | NULL  | joinKey: (Z2.ID = Z1.ID) |            NULL |               NULL |          NULL |
|    1 |    2 |             [1] | TableScan   | TESTDB.TEMPORARY_DOC_TEST.Z2 | NULL  | ID                       |               1 |                  1 |           512 |
|    1 |    3 |             [1] | JoinFilter  | NULL                         | NULL  | joinKey: (Z2.ID = Z1.ID) |            NULL |               NULL |          NULL |
|    1 |    4 |             [3] | TableScan   | TESTDB.TEMPORARY_DOC_TEST.Z1 | NULL  | ID                       |               1 |                  1 |           512 |
+------+------+-----------------+-------------+------------------------------+-------+--------------------------+-----------------+--------------------+---------------+
Copy

서식 있는 텍스트로 쿼리의 EXPLAIN 계획 생성하기:

EXPLAIN USING TEXT SELECT Z1.ID, Z2.ID 
    FROM Z1, Z2
    WHERE Z2.ID = Z1.ID;
+------------------------------------------------------------------------------------------------------------------------------------+
| content                                                                                                                            |
|------------------------------------------------------------------------------------------------------------------------------------|
| GlobalStats:                                                                                                                       |
|     partitionsTotal=2                                                                                                              |
|     partitionsAssigned=2                                                                                                           |
|     bytesAssigned=1024                                                                                                             |
| Operations:                                                                                                                        |
| 1:0     ->Result  Z1.ID, Z2.ID                                                                                                     |
| 1:1          ->InnerJoin  joinKey: (Z2.ID = Z1.ID)                                                                                 |
| 1:2               ->TableScan  TESTDB.TEMPORARY_DOC_TEST.Z2  ID  {partitionsTotal=1, partitionsAssigned=1, bytesAssigned=512}      |
| 1:3               ->JoinFilter  joinKey: (Z2.ID = Z1.ID)                                                                           |
| 1:4                    ->TableScan  TESTDB.TEMPORARY_DOC_TEST.Z1  ID  {partitionsTotal=1, partitionsAssigned=1, bytesAssigned=512} |
|                                                                                                                                    |
+------------------------------------------------------------------------------------------------------------------------------------+
Copy

JSON으로 쿼리의 EXPLAIN 계획 생성하기:

EXPLAIN USING JSON SELECT Z1.ID, Z2.ID 
    FROM Z1, Z2
    WHERE Z2.ID = Z1.ID;
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| content                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| {"GlobalStats":{"partitionsTotal":2,"partitionsAssigned":2,"bytesAssigned":1024},"Operations":[[{"id":0,"operation":"Result","expressions":["Z1.ID","Z2.ID"]},{"id":1,"parentOperators":[0],"operation":"InnerJoin","expressions":["joinKey: (Z2.ID = Z1.ID)"]},{"id":2,"parentOperators":[1],"operation":"TableScan","objects":["TESTDB.TEMPORARY_DOC_TEST.Z2"],"expressions":["ID"],"partitionsAssigned":1,"partitionsTotal":1,"bytesAssigned":512},{"id":3,"parentOperators":[1],"operation":"JoinFilter","expressions":["joinKey: (Z2.ID = Z1.ID)"]},{"id":4,"parentOperators":[3],"operation":"TableScan","objects":["TESTDB.TEMPORARY_DOC_TEST.Z1"],"expressions":["ID"],"partitionsAssigned":1,"partitionsTotal":1,"bytesAssigned":512}]]} |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Copy