EXPLAIN¶
지정된 SQL 문에 대한 논리적 실행 계획을 반환합니다.
실행 계획(explain plan)은 Snowflake가 쿼리를 실행하기 위해 수행할 작업(예: 테이블 스캔 및 조인)을 보여줍니다.
구문¶
EXPLAIN [ USING { TABULAR | JSON | TEXT } ] <statement>
매개 변수¶
statement
실행 계획을 원하는 SQL 문입니다.
USING output_format
이 선택적 절은 출력 형식을 지정합니다. 가능한 출력 형식은 다음과 같습니다.
JSON: JSON 출력은 테이블과 쿼리에 더 쉽게 저장할 수 있습니다.
TABULAR: 테이블 형식의 출력은 JSON 출력보다 일반적으로 사람이 더 읽기 쉽습니다.
TEXT: 서식 있는 텍스트 출력은 JSON 출력보다 일반적으로 사람이 더 읽기 쉽습니다.
기본값은 TABULAR입니다.
출력¶
출력에는 다음 정보가 포함됩니다.
열 |
설명 |
---|---|
|
대부분의 쿼리는 단일 단계를 포함하지만, 일부 쿼리는 여러 개의 고유 단계로 실행됩니다. 이 열은 작업이 속한 단계를 나타냅니다. |
|
쿼리 계획의 각 작업에 할당된 고유 식별자입니다. |
|
작업의 상위 노드에 대한 식별자로 구성된 배열입니다. 쿼리 프로필에서 부모는 자신과 자식을 연결하는 링크와 함께 자식 위에 표시됩니다. |
|
작업의 이름입니다(예: 결과, 필터, TableScan, 조인 등). |
|
테이블 스캔 작업에서 참조하는 오브젝트의 이름입니다(예: 테이블, 구체화된 뷰 또는 보안 뷰). |
|
쿼리에서 오브젝트에 별칭이 주어진 경우 참조된 오브젝트의 별칭입니다. |
|
필터, 조인 조건자, 프로젝션, 집계 등과 같은 현재 작업과 관련된 식의 목록입니다. |
|
참조된 데이터베이스 오브젝트의 총 마이크로 파티션 수입니다. |
|
컴파일 시간 잘라내기 후에 남은 참조된 오브젝트의 파티션 수, 즉 쿼리에서 스캔할 수 있는 파티션 수입니다. |
|
assignPartitions에 포함된 바이트 수입니다. |
사용법 노트¶
EXPLAIN은 SQL 문을 컴파일하지만 실행하지는 않으므로, EXPLAIN은 실행 중인 웨어하우스가 필요하지 않습니다.
EXPLAIN 계획은 현재 웨어하우스의 규모에 따라 달라질 수 있습니다. 현재 웨어하우스 외부에서 EXPLAIN 을 실행하는 경우, Snowflake는 XSMALL 웨어하우스의 용량을 기반으로 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);쿼리에 대해 테이블 형식으로 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 | +------+------+-----------------+-------------+------------------------------+-------+--------------------------+-----------------+--------------------+---------------+서식 있는 텍스트로 쿼리의 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} | | | +------------------------------------------------------------------------------------------------------------------------------------+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}]]} | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+