Leaf 연산자

리프 연산자에는 하위 요소가 없습니다. Leaf 연산자 유형은 다음과 같습니다.

데이터베이스 스키마

이 페이지의 쿼리 및 실행 계획은 다음 데이터베이스 스키마를 기반으로 합니다.

CREATE TABLE Singers (
  SingerId   INT64 NOT NULL,
  FirstName  STRING(1024),
  LastName   STRING(1024),
  SingerInfo BYTES(MAX),
  BirthDate  DATE
) PRIMARY KEY(SingerId);

CREATE INDEX SingersByFirstLastName ON Singers(FirstName, LastName);

CREATE TABLE Albums (
  SingerId        INT64 NOT NULL,
  AlbumId         INT64 NOT NULL,
  AlbumTitle      STRING(MAX),
  MarketingBudget INT64
) PRIMARY KEY(SingerId, AlbumId),
  INTERLEAVE IN PARENT Singers ON DELETE CASCADE;

CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle);

CREATE INDEX AlbumsByAlbumTitle2 ON Albums(AlbumTitle) STORING (MarketingBudget);

CREATE TABLE Songs (
  SingerId  INT64 NOT NULL,
  AlbumId   INT64 NOT NULL,
  TrackId   INT64 NOT NULL,
  SongName  STRING(MAX),
  Duration  INT64,
  SongGenre STRING(25)
) PRIMARY KEY(SingerId, AlbumId, TrackId),
  INTERLEAVE IN PARENT Albums ON DELETE CASCADE;

CREATE INDEX SongsBySingerAlbumSongNameDesc ON Songs(SingerId, AlbumId, SongName DESC), INTERLEAVE IN Albums;

CREATE INDEX SongsBySongName ON Songs(SongName);

CREATE TABLE Concerts (
  VenueId      INT64 NOT NULL,
  SingerId     INT64 NOT NULL,
  ConcertDate  DATE NOT NULL,
  BeginTime    TIMESTAMP,
  EndTime      TIMESTAMP,
  TicketPrices ARRAY<INT64>
) PRIMARY KEY(VenueId, SingerId, ConcertDate);

다음과 같은 데이터 조작 언어(DML) 문을 사용하여 이러한 테이블에 데이터를 추가할 수 있습니다.

INSERT INTO Singers (SingerId, FirstName, LastName, BirthDate)
VALUES (1, "Marc", "Richards", "1970-09-03"),
       (2, "Catalina", "Smith", "1990-08-17"),
       (3, "Alice", "Trentor", "1991-10-02"),
       (4, "Lea", "Martin", "1991-11-09"),
       (5, "David", "Lomond", "1977-01-29");

INSERT INTO Albums (SingerId, AlbumId, AlbumTitle)
VALUES (1, 1, "Total Junk"),
       (1, 2, "Go, Go, Go"),
       (2, 1, "Green"),
       (2, 2, "Forever Hold Your Peace"),
       (2, 3, "Terrified"),
       (3, 1, "Nothing To Do With Me"),
       (4, 1, "Play");

INSERT INTO Songs (SingerId, AlbumId, TrackId, SongName, Duration, SongGenre)
VALUES (2, 1, 1, "Let's Get Back Together", 182, "COUNTRY"),
       (2, 1, 2, "Starting Again", 156, "ROCK"),
       (2, 1, 3, "I Knew You Were Magic", 294, "BLUES"),
       (2, 1, 4, "42", 185, "CLASSICAL"),
       (2, 1, 5, "Blue", 238, "BLUES"),
       (2, 1, 6, "Nothing Is The Same", 303, "BLUES"),
       (2, 1, 7, "The Second Time", 255, "ROCK"),
       (2, 3, 1, "Fight Story", 194, "ROCK"),
       (3, 1, 1, "Not About The Guitar", 278, "BLUES");

배열 중첩 해제

배열 중첩 해제 연산자는 입력 배열을 요소 행으로 평면화합니다. 각 결과 행에는 배열의 값과 0부터 시작하는 배열 내 위치(선택사항)가 들어 있는 최대 2개의 열이 포함됩니다.

다음 쿼리는 이 연산자를 보여줍니다.

SELECT a, b FROM UNNEST([1,2,3]) a WITH OFFSET b;

/*---+---+
 | a | b |
 +---+---+
 | 1 | 0 |
 | 2 | 1 |
 | 3 | 2 |
 +---+---*/

이 쿼리는 a 열에 있는 [1,2,3] 배열을 평면화하고 b 열에 배열 위치를 표시합니다.

실행 계획은 다음과 같이 표시됩니다.

배열 중첩 해제 연산자 실행 계획

속성 및 실행 통계

연산자의 속성은 연산자가 실행될 때 사용되는 특성을 설명합니다. 실행 통계는 쿼리 실행 중에 수집되는 값으로, 연산자의 성능을 평가하는 데 도움이 됩니다.

속성

이름 설명
실행 메소드입니다. 행 실행에서 연산자는 한 번에 한 행을 처리합니다. 일괄 실행에서 연산자는 한 번에 행 배치를 처리합니다.

실행 통계

이름 설명
지연 시간 연산자에서 실행된 모든 실행의 경과 시간입니다.
누적 지연 시간 현재 연산자와 그 하위 요소의 총 시간입니다.
CPU 시간 연산자를 실행하는 데 사용된 CPU 시간의 합계입니다.
누적 CPU 시간 연산자와 그 하위 요소를 실행하는 데 소요된 총 CPU 시간입니다.
실행 시간 쿼리를 실행하고 결과를 처리하는 데 걸린 총시간입니다.
반환된 행 이 연산자가 출력한 행 수
실행 횟수 연산자가 실행된 횟수입니다. 일부 실행은 동시에 실행할 수 있습니다.

관계 생성

관계 생성 연산자는 0개 이상의 행을 반환합니다.

속성 및 실행 통계

연산자의 속성은 연산자가 실행될 때 사용되는 특성을 설명합니다. 실행 통계는 쿼리 실행 중에 수집되는 값으로, 연산자의 성능을 평가하는 데 도움이 됩니다.

속성

이름 설명
실행 메소드입니다. 행 실행에서 연산자는 한 번에 한 행을 처리합니다. 일괄 실행에서 연산자는 한 번에 행 배치를 처리합니다.

실행 통계

이름 설명
지연 시간 연산자에서 실행된 모든 실행의 경과 시간입니다.
누적 지연 시간 현재 연산자와 그 하위 요소의 총 시간입니다.
CPU 시간 연산자를 실행하는 데 사용된 CPU 시간의 합계입니다.
누적 CPU 시간 연산자와 그 하위 요소를 실행하는 데 소요된 총 CPU 시간입니다.
실행 시간 쿼리를 실행하고 결과를 처리하는 데 걸린 총시간입니다.
반환된 행 이 연산자가 출력한 행 수
실행 횟수 연산자가 실행된 횟수입니다. 일부 실행은 동시에 실행할 수 있습니다.

단위 관계

단위 관계는 1개의 행을 반환합니다. 이것은 관계 생성 연산자의 특별한 경우입니다.

다음 쿼리는 이 연산자를 보여줍니다.

SELECT 1 + 2 AS Result;

/*--------+
 | Result |
 +--------+
 | 3      |
 +--------*/

실행 계획은 다음과 같이 표시됩니다.

단위 관계 연산자 실행 계획

속성 및 실행 통계

연산자의 속성은 연산자가 실행될 때 사용되는 특성을 설명합니다. 실행 통계는 쿼리 실행 중에 수집되는 값으로, 연산자의 성능을 평가하는 데 도움이 됩니다.

속성

이름 설명
실행 메소드입니다. 행 실행에서 연산자는 한 번에 한 행을 처리합니다. 일괄 실행에서 연산자는 한 번에 행 배치를 처리합니다.

실행 통계

이름 설명
지연 시간 연산자에서 실행된 모든 실행의 경과 시간입니다.
누적 지연 시간 현재 연산자와 그 하위 요소의 총 시간입니다.
CPU 시간 연산자를 실행하는 데 사용된 CPU 시간의 합계입니다.
누적 CPU 시간 연산자와 그 하위 요소를 실행하는 데 소요된 총 CPU 시간입니다.
실행 시간 쿼리를 실행하고 결과를 처리하는 데 걸린 총시간입니다.
반환된 행 이 연산자가 출력한 행 수
실행 횟수 연산자가 실행된 횟수입니다. 일부 실행은 동시에 실행할 수 있습니다.

빈 관계

빈 관계는 행을 반환하지 않습니다. 이것은 관계 생성 연산자의 특별한 경우입니다.

다음 쿼리는 이 연산자를 보여줍니다.

SELECT *
FROM   albums
LIMIT  0

/*
No result
*/

실행 계획은 다음과 같이 표시됩니다.

빈 관계 연산자 실행 계획

속성 및 실행 통계

연산자의 속성은 연산자가 실행될 때 사용되는 특성을 설명합니다. 실행 통계는 쿼리 실행 중에 수집되는 값으로, 연산자의 성능을 평가하는 데 도움이 됩니다.

속성

이름 설명
실행 메소드입니다. 행 실행에서 연산자는 한 번에 한 행을 처리합니다. 일괄 실행에서 연산자는 한 번에 행 배치를 처리합니다.

실행 통계

이름 설명
지연 시간 연산자에서 실행된 모든 실행의 경과 시간입니다.
누적 지연 시간 현재 연산자와 그 하위 요소의 총 시간입니다.
CPU 시간 연산자를 실행하는 데 사용된 CPU 시간의 합계입니다.
누적 CPU 시간 연산자와 그 하위 요소를 실행하는 데 소요된 총 CPU 시간입니다.
실행 시간 쿼리를 실행하고 결과를 처리하는 데 걸린 총시간입니다.
반환된 행 이 연산자가 출력한 행 수
실행 횟수 연산자가 실행된 횟수입니다. 일부 실행은 동시에 실행할 수 있습니다.

스캔

스캔 연산자는 행 소스를 스캔하여 반환합니다. 다음은 스캔 연산자의 유형입니다.

  • 테이블 스캔: 테이블을 스캔합니다.
  • 색인 스캔: 색인을 스캔합니다.
  • 배치 스캔: 다른 관계형 연산자에서 생성된 중간 테이블 (예: 분산 교차 적용에서 생성된 테이블)에서 스캔이 실행됩니다.

가능할 때마다 Spanner는 스캔의 일부로 키에 조건자를 적용합니다. Spanner가 조건자를 적용하면 스캔 시 전체 테이블 또는 색인을 읽을 필요가 없으므로 스캔이 보다 효율적으로 실행됩니다. 조건자는 실행 계획에 다음과 같이 표시됩니다.

  • 검색 가능한 조건: 검색 가능한 조건은 Spanner가 테이블에서 액세스할 특정 행을 결정할 수 있는 경우에 적용됩니다. 일반적으로는 필터가 기본 키의 프리픽스에 있는 경우가 이에 해당합니다. 예를 들어 기본 키가 Col1Col2로 구성된 경우, Col1 또는 Col1Col2의 명시적 값을 포함하는 WHERE 절은 검색 가능합니다. 이 경우 Spanner는 키 범위 내에서만 데이터를 읽습니다.

쿼리가 테이블의 모든 행을 조회해야 하는 경우 전체 스캔이 발생하며, 이는 실행 계획에 full scan: true로 표시됩니다.

다음 쿼리는 이 연산자를 보여줍니다.

SELECT s.lastname
FROM   singers@{FORCE_INDEX=SingersByFirstLastName} as s
WHERE  s.firstname = 'Catalina';

/*----------+
 | LastName |
 +----------+
 | Smith    |
 +----------*/

실행 계획 세그먼트는 다음과 같이 표시됩니다.

스캔 연산자 실행 계획

실행 계획에서 최상위 수준의 분산 통합 연산자는 원격 서버로 하위 계획을 보냅니다. 각 하위 계획에는 결과 직렬화 연산자와 색인 스캔 연산자가 있습니다. 조건자 Key Predicate: FirstName = 'Catalina'는 색인 SingersByFirstLastname에서 FirstNameCatalina인 행으로 스캔을 제한합니다. 색인 스캔은 출력을 결과 직렬화 연산자로 반환합니다.

Spanner는 스캔을 필터 스캔과 긴밀하게 결합하고 이를 단일 연산자로 간주합니다. 탐색 조건이 없으면 연산자가 전체 검색으로 표시됩니다.

속성 및 실행 통계

연산자의 속성은 연산자가 실행될 때 사용되는 특성을 설명합니다. 실행 통계는 쿼리 실행 중에 수집되는 값으로, 연산자의 성능을 평가하는 데 도움이 됩니다.

스캔 연산자에는 고유한 속성과 실행 통계가 추가로 있습니다.

속성

이름 설명
스캔 방법 , 일괄 또는 자동일 수 있습니다. 행 실행에서 연산자는 한 번에 한 행을 처리합니다. 일괄 실행에서 연산자는 한 번에 행의 배치를 처리합니다. 자동 실행에서 연산자는 Row 메서드를 사용하여 스캔을 시작하지만 필요한 경우 Batch로 변경할 수 있습니다.
탐색 조건 테이블의 효율적인 조회를 실행하는 데 사용되는 기본 키에 관한 프레디케이트입니다. 이 속성은 원하는 행 집합을 생성하기 위해 전체 테이블을 스캔할 필요가 없음을 의미합니다. 이 속성은 Table ScansIndex Scans에만 적용됩니다.
변수 할당 테이블에서 읽은 열 목록입니다.
실행 메소드입니다. 행 실행에서 연산자는 한 번에 한 행을 처리합니다. 일괄 실행에서 연산자는 한 번에 행 배치를 처리합니다.

실행 통계

이름 설명
스캔된 행 스캔 중에 읽은 행 수입니다.
탐색 횟수 이 스캔 연산자가 실행한 조회 또는 탐색 수입니다.
지연 시간 연산자에서 실행된 모든 실행의 경과 시간입니다.
누적 지연 시간 현재 연산자와 그 하위 요소의 총 시간입니다.
CPU 시간 연산자를 실행하는 데 사용된 CPU 시간의 합계입니다.
누적 CPU 시간 연산자와 그 하위 요소를 실행하는 데 소요된 총 CPU 시간입니다.
실행 시간 쿼리를 실행하고 결과를 처리하는 데 걸린 총시간입니다.
반환된 행 이 연산자가 출력한 행 수
실행 횟수 연산자가 실행된 횟수입니다. 일부 실행은 동시에 실행할 수 있습니다.

필터 스캔

필터 스캔 연산자는 항상 테이블 또는 색인 스캔의 맨 위에 있습니다. 이 연산자는 스캔을 사용하여 데이터베이스에서 읽은 행의 수를 줄이기 때문에 일반적으로 필터를 사용하는 경우보다 스캔이 더 빠릅니다. Spanner는 특정 조건에서 필터 스캔을 적용합니다.

  • 잔여 조건: 읽는 데이터의 양을 제한하기 위해 Spanner가 스캔을 평가할 수 있는 그 밖의 모든 조건입니다.

다음 쿼리는 이 연산자를 보여줍니다.

SELECT lastname
FROM   singers
WHERE  singerid = 1

/*----------+
 | LastName |
 +----------+
 | Richards |
 +----------*/

실행 계획은 다음과 같이 표시됩니다.

필터 스캔 연산자 실행 계획

속성 및 실행 통계

연산자의 속성은 연산자가 실행될 때 사용되는 특성을 설명합니다. 실행 통계는 쿼리 실행 중에 수집되는 값으로, 연산자의 성능을 평가하는 데 도움이 됩니다.

필터 스캔 연산자에는 추가 고유 속성이 있습니다.

속성

이름 설명
잔여 조건 행을 읽은 후 적용되는 조건자입니다.
실행 메소드입니다. 행 실행에서 연산자는 한 번에 한 행을 처리합니다. 일괄 실행에서 연산자는 한 번에 행 배치를 처리합니다.

실행 통계

이름 설명
지연 시간 연산자에서 실행된 모든 실행의 경과 시간입니다.
누적 지연 시간 현재 연산자와 그 하위 요소의 총 시간입니다.
CPU 시간 연산자를 실행하는 데 사용된 CPU 시간의 합계입니다.
누적 CPU 시간 연산자와 그 하위 요소를 실행하는 데 소요된 총 CPU 시간입니다.
실행 시간 쿼리를 실행하고 결과를 처리하는 데 걸린 총시간입니다.
반환된 행 이 연산자가 출력한 행 수
실행 횟수 연산자가 실행된 횟수입니다. 일부 실행은 동시에 실행할 수 있습니다.