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은 컴퓨팅 크레딧을 사용하지 않지만, 쿼리를 컴파일하면 다른 메타데이터 작업에서 클라우드 서비스 크레딧을 사용하는 것처럼 크레딧을 사용합니다.
이 명령의 출력을 사후 처리하려면 다음 방법으로 수행할 수 있습니다.
쿼리할 수 있는 테이블로 출력을 처리하는 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}]]} | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+