GENERATOR
GENERATOR
지정한 행 수, 지정한 생성 시간(초), 또는 둘 다를 기준으로 데이터 행을 만들어요. 이 시스템 정의 테이블 함수는 가상(synthetic) 행 생성을 지원해요.
0개 열이지만 행이 많을 수 있는 가상 테이블을 생성할 수 있다는 점에 유의하세요. SELECT 절이 전적으로 데이터 생성 함수로만 구성된 쿼리에는 이러한 가상 테이블이 유용해요.
본문
구문
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 |
+---------------+
더 알아보기
- Table functions — 테이블 함수 모음
- SEQ1 / SEQ2 / SEQ4 / SEQ8 — 시퀀스 생성
- ROW_NUMBER — 행 번호 부여
- UNIFORM — 균등 분포 난수 생성