분산 연산자

분산 연산자는 리프, 단항, 이항 또는 n항 연산자와 달리 여러 서버에서 실행됩니다.

다음 연산자가 분산 연산자입니다.

데이터베이스 스키마

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

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");

분산 통합 연산자는 분산 교차 적용 및 분산 외부 적용을 파생시킨 기본 연산자입니다.

분산 연산자는 1개 이상의 로컬 분산 통합 변형 위에 분산 통합 변형을 사용하여 실행 계획에 나타납니다. 분산 통합 변형은 하위 계획의 원격 배포를 수행합니다.

로컬 분산 통합 변형은 쿼리에 대해 수행된 각 스캔 위에 있습니다. 로컬 분산 통합 변형은 동적으로 변하는 분할 경계에 재시작이 발생하는 경우 안정적인 쿼리 실행을 보장합니다. 이 연산자는 시각적 계획에서 숨겨져 있지만 항상 존재합니다.

가능한 경우 분산 통합 변형은 분할 프루닝을 위해 분할 조건자를 사용합니다. 분할 잘라내기는 원격 서버가 조건자를 충족하는 분할에만 하위 계획을 실행하여 지연 시간과 쿼리 성능을 개선한다는 의미입니다.

분산 통합

분산 통합 연산자는 테이블 1개 이상을 개념적으로 여러 분할로 분할하고 각 분할에서 독립적으로 서브 쿼리를 원격 평가한 후 모든 결과를 통합합니다.

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

SELECT s.songname,
       s.songgenre
FROM   songs AS s
WHERE  s.singerid = 2
       AND s.songgenre = 'ROCK';

/*-----------------+-----------+
 | SongName        | SongGenre |
 +-----------------+-----------+
 | Starting Again  | ROCK      |
 | The Second Time | ROCK      |
 | Fight Story     | ROCK      |
 +-----------------+-----------*/

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

분산 통합 연산자 실행 계획

분산 통합 연산자는 쿼리의 조건자 WHERE s.SingerId = 2 AND s.SongGenre = 'ROCK'을 충족하는 분할에서 테이블 스캔을 수행하는 원격 서버로 하위 계획을 보냅니다. 결과 직렬화 연산자는 테이블 스캔에서 반환된 행으로부터 SongNameSongGenre 값을 계산합니다. 그런 다음 분산 통합 연산자는 원격 서버에서 결합된 결과를 SQL 쿼리 결과로 반환합니다.

속성 및 실행 통계

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

분산 통합 연산자에는 추가적인 고유 실행 통계가 있습니다.

속성

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

실행 통계

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

일반적으로 실행은 교차 적용 실행과 달리 병렬로 실행됩니다. 따라서 분산 연산자의 지연 시간 수는 해당 연산자가 추가한 지연 시간을 보고하는 대부분의 연산자와 달리 누적됩니다. 분산된 유니온의 실행 수는 테이블의 분할 경계를 기반으로 하며, 이는 데이터 크기와 부하에 따라 달라지고 use_additional_parallelism 문장 힌트를 포함할 수 있습니다. 이 통계 접근 방식은 모든 분산 연산자에 적용됩니다.

분산 적용

분산 적용 (DA) 연산자는 여러 서버에서 실행하여 적용 조인 연산자를 확장합니다. 입력 측은 행을 배치로 그룹화합니다 (한 번에 입력 행 1개에서만 작업을 수행하는 일반 교차 적용 연산자와 다름). DA 맵 측은 원격 서버에서 실행되는 일반 적용 조인 연산자 조합입니다. 분산 적용 조인은 적용 조인과 동일한 적용 메서드를 지원합니다.

속성 및 실행 통계

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

분산 적용 연산자에는 추가적인 고유 실행 통계가 있습니다.

속성

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

실행 통계

이름 설명
로컬 병렬 실행 동시에 실행된 하위 쿼리 수입니다.
원격 호출 실행된 원격 하위 쿼리 수입니다.
배치 수 배치는 동시에 처리되는 행의 동적 컬렉션입니다. 입력에서 맵 측으로 전송된 분산 교차 적용의 배치 수를 보여줍니다.
지연 시간 연산자에서 실행된 모든 실행의 경과 시간입니다.
누적 지연 시간 현재 연산자와 그 하위 요소의 총 시간입니다.
CPU 시간 연산자를 실행하는 데 사용된 CPU 시간의 합계입니다.
누적 CPU 시간 연산자와 그 하위 요소를 실행하는 데 소요된 총 CPU 시간입니다.
실행 시간 쿼리를 실행하고 결과를 처리하는 데 걸린 총시간입니다.
반환된 행 이 연산자가 출력한 행 수
실행 횟수 연산자가 실행된 횟수입니다. 일부 실행은 동시에 실행할 수 있습니다.

분산 교차 적용

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

SELECT albumtitle
FROM   songs
       JOIN albums
         ON albums.albumid = songs.albumid;

/*-----------------------+
 | AlbumTitle            |
 +-----------------------+
 | Green                 |
 | Nothing To Do With Me |
 | Play                  |
 | Total Junk            |
 | Green                 |
 +-----------------------*/

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

분산 교차 적용 연산자 실행 계획

DCA 입력에는 AlbumId의 행을 일괄 처리하는 SongsBySingerAlbumSongNameDesc 색인에 대한 색인 스캔이 포함됩니다. DCA의 맵 측은 표준 교차 적용으로, 입력은 행의 배치이고 맵 측은 AlbumsByAlbumTitle 색인에서 AlbumId 키와 일치하는 입력 행의 AlbumId 조건자를 조건으로 하는 색인 AlbumsByAlbumTitle의 색인 스캔입니다. 이 매핑으로 일괄 처리된 입력 행의 SingerId 값에 대한 SongName이 반환됩니다.

이 예시의 DCA 프로세스를 요약하면 DCA 입력은 Albums 테이블에서 일괄 처리된 행이고 DCA의 출력은 색인 스캔 맵에 이 행을 적용한 것입니다.

분산 외부 적용

분산 외부 적용은 왼쪽 외부 조인 시맨틱스가 있는 DA입니다. 의미 체계에 관한 자세한 내용은 outer apply를 참고하세요.

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

SELECT lastname,
       concertdate
FROM   singers LEFT OUTER join@{JOIN_TYPE=APPLY_JOIN} concerts
ON singers.singerid=concerts.singerid;

/*----------+-------------+
 | LastName | ConcertDate |
 +----------+-------------+
 | Trentor  | 2014-02-18  |
 | Smith    | 2011-09-03  |
 | Smith    | 2010-06-06  |
 | Lomond   | 2005-04-30  |
 | Martin   | 2015-11-04  |
 | Richards |             |
 +----------+-------------*/

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

분산 외부 적용 연산자 실행 계획

분산 준적용

분산 세미 적용은 세미 조인 시맨틱스가 있는 DA입니다. 의미에 관한 자세한 내용은 semi apply를 참고하세요.

분산된 반세미 적용

분산 안티 세미 적용은 안티 세미 조인 의미 체계가 있는 DA입니다. 의미에 관한 자세한 내용은 anti-semi apply를 참고하세요.

분산 병합 통합

분산 병합 통합 연산자는 여러 원격 서버에 쿼리를 분산합니다. 그런 다음 쿼리 결과를 결합하여 분산 병합 정렬이라고 하는 정렬된 결과를 생성합니다.

분산 병합 통합은 다음 단계를 실행합니다.

  1. 루트 서버는 쿼리된 데이터의 분할을 호스팅하는 각 원격 서버로 서브 쿼리를 보냅니다. 서브 쿼리에는 결과가 특정 순서로 정렬되는 지침이 포함됩니다.

  2. 각 원격 서버는 분할에서 서브 쿼리를 실행한 후 요청된 순서대로 결과를 다시 보냅니다.

  3. 루트 서버는 정렬된 서브 쿼리를 병합하여 완전히 정렬된 결과를 생성합니다.

분산 병합 통합은 Spanner 버전 3 이상에 기본적으로 사용 설정되어 있습니다.

속성 및 실행 통계

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

분산 적용 연산자에는 추가적인 고유 실행 통계가 있습니다.

속성

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

실행 통계

이름 설명
로컬 병렬 실행 동시에 실행된 하위 쿼리 수입니다.
원격 호출 실행된 원격 하위 쿼리 수입니다.
배치 수 배치는 동시에 처리되는 행의 동적 컬렉션입니다. 입력에서 맵 측으로 전송된 분산 교차 적용의 배치 수를 보여줍니다.
지연 시간 연산자에서 실행된 모든 실행의 경과 시간입니다.
누적 지연 시간 현재 연산자와 그 하위 요소의 총 시간입니다.
CPU 시간 연산자를 실행하는 데 사용된 CPU 시간의 합계입니다.
누적 CPU 시간 연산자와 그 하위 요소를 실행하는 데 소요된 총 CPU 시간입니다.
실행 시간 쿼리를 실행하고 결과를 처리하는 데 걸린 총시간입니다.
반환된 행 이 연산자가 출력한 행 수
실행 횟수 연산자가 실행된 횟수입니다. 일부 실행은 동시에 실행할 수 있습니다.

푸시 브로드캐스트 해시 조인

푸시 브로드캐스트 해시 조인 연산자는 분산 해시 조인을 기반으로 구현된 SQL 조인입니다. 푸시 브로드캐스트 해시 조인 연산자는 데이터 배치 구성을 위해 입력 측에서 행을 읽습니다. 연산자는 맵 측면 데이터를 포함하는 모든 서버에 이 배치를 브로드캐스트합니다. 데이터 배치가 수신된 대상 서버에서 연산자는 배치를 빌드 측 데이터로 사용하여 해시 조인을 빌드하고 로컬 데이터를 해시 조인의 프로브 측으로 스캔합니다.

푸시 브로드캐스트 해시 조인에는 다음과 같은 장점이 있습니다.

  • 빌드 테이블이 작은 경우 모든 맵 측 분할에 전송할 수 있습니다.
  • 지도 측 테이블은 잔여 필터가 있거나 없는 상태로 스캔할 수 있습니다. 조인 키가 맵 테이블의 기본 키와 동일하지 않은 경우에 발생합니다.

푸시 브로드캐스트 해시 조인은 최적화 도구에서 자동으로 선택되지 않습니다. 이 연산자를 사용하려면 다음 예시에 표시된 것처럼 쿼리 힌트에서 조인 메서드를 PUSH_BROADCAST_HASH_JOIN에 설정합니다.

SELECT a.albumtitle,
       s.songname
FROM   albums AS a join@{join_method=push_broadcast_hash_join} songs AS s
ON     a.singerid = s.singerid
AND    a.albumid = s.albumid;

/*-----------------------+--------------------------+
 | AlbumTitle            | SongName                 |
 +-----------------------+--------------------------+
 | Green                 | The Second Time          |
 | Green                 | Starting Again           |
 | Green                 | Nothing Is The Same      |
 | Green                 | Let's Get Back Together  |
 | Green                 | I Knew You Were Magic    |
 | Green                 | Blue                     |
 | Green                 | 42                       |
 | Terrified             | Fight Story              |
 | Nothing To Do With Me | Not About The Guitar     |
 +-----------------------+--------------------------*/

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

푸시 브로드캐스트 해시 조인 연산자 실행 계획

푸시 브로드캐스트 해시 조인에 대한 입력은 AlbumsByAlbumTitle 색인입니다. 연산자는 이러한 입력을 데이터의 배치로 직렬화합니다. 연산자는 이 배치를 SongsBySingerAlbumSongNameDesc 색인의 모든 로컬 분할로 전송합니다. 여기서 연산자는 배치를 역직렬화하고 해시 테이블로 빌드합니다. 그런 후 해시 테이블은 로컬 색인 데이터를 프로브로 사용하여 결과 일치 항목을 반환합니다.

일치 결과는 반환되기 전에 나머지 조건으로 필터링될 수도 있습니다. (나머지 조건이 나타나는 부분의 예시는 비동등 조인에 있습니다.)

속성 및 실행 통계

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

분산 적용 연산자에는 추가적인 고유 실행 통계가 있습니다.

속성

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

실행 통계

이름 설명
로컬 병렬 실행 동시에 실행된 하위 쿼리 수입니다.
원격 호출 실행된 원격 하위 쿼리 수입니다.
배치 수 배치는 동시에 처리되는 행의 동적 컬렉션입니다. 입력에서 맵 측으로 전송된 분산 교차 적용의 배치 수를 보여줍니다.
지연 시간 연산자에서 실행된 모든 실행의 경과 시간입니다.
누적 지연 시간 현재 연산자와 그 하위 요소의 총 시간입니다.
CPU 시간 연산자를 실행하는 데 사용된 CPU 시간의 합계입니다.
누적 CPU 시간 연산자와 그 하위 요소를 실행하는 데 소요된 총 CPU 시간입니다.
실행 시간 쿼리를 실행하고 결과를 처리하는 데 걸린 총시간입니다.
반환된 행 이 연산자가 출력한 행 수
실행 횟수 연산자가 실행된 횟수입니다. 일부 실행은 동시에 실행할 수 있습니다.