GENERATOR

GENERATOR

지정한 행 수, 지정한 생성 시간(초), 또는 둘 다를 기준으로 데이터 행을 만들어요. 이 시스템 정의 테이블 함수는 가상(synthetic) 행 생성을 지원해요.

0개 열이지만 행이 많을 수 있는 가상 테이블을 생성할 수 있다는 점에 유의하세요. SELECT 절이 전적으로 데이터 생성 함수로만 구성된 쿼리에는 이러한 가상 테이블이 유용해요.

출처: Snowflake SQL Reference - GENERATOR

본문

구문

GENERATOR( ROWCOUNT => <count> [ , TIMELIMIT => <sec> ] )

GENERATOR( [ TIMELIMIT => <sec> ] )

사용 시 참고 사항

  • count와 sec는 음수가 아닌 정수 상수여야 해요.
  • ROWCOUNT 인자만 지정하면 결과 테이블은 count개의 행을 담아요.
  • TIMELIMIT 인자만 지정하면 쿼리는 sec초 동안 실행되며, 그 시간 안에 가능한 한 많은 행을 생성해요. 정확한 행 수는 시스템 속도에 따라 달라져 완전히 결정적이지는 않아요.
  • ROWCOUNT와 TIMELIMIT 인자를 모두 지정한 경우: ROWCOUNT가 TIMELIMIT보다 먼저 도달하면 결과 테이블은 count개의 행을 담아요. TIMELIMIT가 ROWCOUNT보다 먼저 도달하면 테이블은 그 시간 안에 생성된 행 수를 담아요. 정확한 행 수는 시스템 속도에 따라 달라져 완전히 결정적이지는 않아요.
  • ROWCOUNT 또는 TIMELIMIT가 null이면 무시돼요. 따라서 generator(ROWCOUNT => null)은 0개의 행을 생성해요.
  • 두 매개변수(ROWCOUNT와 TIMELIMIT)를 모두 생략하면 GENERATOR 함수는 0개의 행을 반환해요.
  • 행의 내용은 GENERATOR 함수 자체가 아니라 프로젝션 절의 함수들에 의해 결정돼요. 자세한 내용은 아래 예시 섹션을 참고하세요. 프로젝션 절에서 사용할 특정 함수(예: SEQ())의 설명도 참고하세요. 모든 유효한 함수가 빈틈 없는 시퀀스를 만드는 것은 아니에요.

예시

참고: 이 예시들은 빈틈이 있을 수 있는 시퀀스를 생성해요. 빈틈 없이 시퀀스를 생성하는 예시는 SEQ1 / SEQ2 / SEQ4 / SEQ8과 ROW_NUMBER를 참고하세요.

이 예시는 GENERATOR 함수로 10개의 행을 생성해요. 행의 내용은 프로젝션 절의 함수들에 의해 결정돼요.

  • SEQ4() 열은 0부터 시작하는 4바이트 정수 시퀀스를 생성해요.
  • UNIFORM(…) 열은 세 번째 매개변수로 전달된 함수 또는 상수를 기준으로, 첫 번째 매개변수(1)와 두 번째 매개변수(10) 사이의 값을 생성해요.

이 예시는 출력을 일관되게 만들기 위해 RANDOM() 함수에 선택적 "시드(seed)"를 포함해요.

SELECT seq4(), uniform(1, 10, RANDOM(12))
  FROM TABLE(GENERATOR(ROWCOUNT => 10)) v
  ORDER BY 1;
+--------+----------------------------+
| SEQ4() | UNIFORM(1, 10, RANDOM(12)) |
|--------+----------------------------|
|      0 |                          7 |
|      1 |                          2 |
|      2 |                          5 |
|      3 |                          9 |
|      4 |                          6 |
|      5 |                          9 |
|      6 |                          9 |
|      7 |                          5 |
|      8 |                          3 |
|      9 |                          8 |
+--------+----------------------------+

이 예시는 앞의 예시와 비슷하지만, UNIFORM 함수의 세 번째 매개변수로 함수가 아니라 상수를 전달해요. 결과적으로 UNIFORM 열의 출력이 모든 행에서 동일해요.

SELECT seq4(), uniform(1, 10, 42)
  FROM TABLE(GENERATOR(ROWCOUNT => 10)) v
  ORDER BY 1;
+--------+--------------------+
| SEQ4() | UNIFORM(1, 10, 42) |
|--------+--------------------|
|      0 |                 10 |
|      1 |                 10 |
|      2 |                 10 |
|      3 |                 10 |
|      4 |                 10 |
|      5 |                 10 |
|      6 |                 10 |
|      7 |                 10 |
|      8 |                 10 |
|      9 |                 10 |
+--------+--------------------+

ROWCOUNT와 TIMELIMIT 매개변수를 모두 생략하면 출력은 0개 행이에요.

SELECT seq4(), uniform(1, 10, RANDOM(12))
  FROM TABLE(GENERATOR()) v
  ORDER BY 1;
+--------+----------------------------+
| SEQ4() | UNIFORM(1, 10, RANDOM(12)) |
|--------+----------------------------|
+--------+----------------------------+

다음 예시는 ROWCOUNT 매개변수 없이 TIMELIMIT 매개변수를 사용해요.

SELECT COUNT(seq4()) FROM TABLE(GENERATOR(TIMELIMIT => 10)) v;

+---------------+
| COUNT(SEQ4()) |
|---------------|
|    3615440896 |
+---------------+

더 알아보기