説明
GENERATOR関数は、Table Functionフレームワークで使用するために設計された特殊な組み込み関数です。主な役割は、指定された数の行を含む仮想テーブルを生成することです。このテーブルには実際のデータは含まれず、データを挿入できる構造を提供します。GENERATOR関数は通常、一連の連続した行を生成して、一括処理やデータセットのシミュレーションを行うために使用されます。
Table FunctionはSQLの高度な機能であり、関数が単一の値ではなく、テーブル全体を返すことを可能にします。これは、Table Functionが通常のデータテーブルと同様に、複数の行と列を生成できることを意味します。
TABLE(GENERATOR(N))は、N行を含む仮想テーブルを生成します。ここで、Nは0以上の64ビット整数です。この仮想テーブルに具体的なデータを含める場合は、SELECTステートメントの後に、定数、計算式、関数呼び出し、またはユーザー定義関数(UDF)などのデータ生成ロジックを追加する必要があります。
TABLE(GENERATOR(N))はパラレル実行をサポートしています。パラレルSELECTクエリやパラレルデータ操作言語(DML)操作で使用できます。ただし、これらの仮想行を生成するプロセス自体は並列ではありません。TABLE(GENERATOR(N))が生成する行を読み取るのは、単一のスレッドのみです。そのため、TABLE(GENERATOR(N))を含むデータフロー演算子(Data Flow Operator, DFO)では、Degree of Parallelism (DOP)の設定は1にする必要があります。
制限事項と注意点
TABLE(GENERATOR(N))が生成するのは、実際のデータを持たない仮想テーブルであり、データを埋めるにはSELECTステートメントで指定する必要があります。TABLE(GENERATOR(N))はパラレル操作で使用できますが、行生成プロセス自体はスレッド単一です。
構文
TABLE(GENERATOR(N))
パラメータの説明
N:0以上の64ビットの正の整数で、生成する行数を指定します。
例
- 例1:
obclient [SYS]> SELECT * FROM TABLE(GENERATOR(10));
上記のSQL文は、表示するデータが指定されていないため、各行が空の10行からなる仮想テーブルを生成します。
実行結果は次のとおりです:
+--------------+
| COLUMN_VALUE |
+--------------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
+--------------+
10 rows in set
具体的なデータを生成したい場合は、次のように書くことができます:
obclient [SYS]> SELECT 'Hello, World!' AS greeting FROM TABLE(GENERATOR(10));
このクエリは、各行のgreeting列に文字列Hello, World!を含む10行の仮想テーブルを生成します。
実行結果は次のとおりです:
+---------------+
| GREETING |
+---------------+
| Hello, World! |
| Hello, World! |
| Hello, World! |
| Hello, World! |
| Hello, World! |
| Hello, World! |
| Hello, World! |
| Hello, World! |
| Hello, World! |
| Hello, World! |
+---------------+
10 rows in set
- 例2:
GENERATOR()関数を使用して条件に一致するランダム数を生成します。
obclient> SELECT COUNT(*) FROM TABLE(GENERATOR(100000));
+----------+
| COUNT(*) |
+----------+
| 100000 |
+----------+
1 row in set
obclient> SELECT NORMAL(0, 1, RANDOM()) FROM TABLE(GENERATOR(5));
+------------------------+
| NORMAL(0, 1, RANDOM()) |
|------------------------|
| 0.227384164 |
| 0.9945290748 |
| -0.2045078571 |
| -1.594607893 |
| -0.8213296842 |
+------------------------+
5 rows in set
obclient> SELECT RANDSTR(1, ZIPF(1, 5, RANDOM())) str FROM TABLE(GENERATOR(5));
+------------------------+
| str |
|------------------------|
| A |
| D |
| A |
| A |
| C |
+------------------------+
5 rows in set
- 例3:
GENERATOR()関数は他のテーブルともJOINできます。例:
obclient> CREATE TABLE t1 (c1 INT);
Query OK, 0 rows affected
obclient> INSERT INTO t1 VALUES (1), (2);
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0
obclient> SELECT c1, RANDOM(1) FROM t1, TABLE(GENERATOR(3));
+------+----------------------+
| c1 | RANDOM(1) |
+------+----------------------+
| 1 | -6753783847308464280 |
| 2 | -6707106347154343346 |
| 1 | -899926183391115878 |
| 2 | -8835543475904200562 |
| 1 | -2750444335953844424 |
| 2 | 7588216632478230601 |
+------+----------------------+
6 rows in set
obclient> EXPLAIN SELECT c1, RANDOM(1) FROM t1, TABLE(GENERATOR(3));
+----------------------------------------------------------------------------------+
| Query Plan |
+----------------------------------------------------------------------------------+
| ================================================================== |
| |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| |
| ------------------------------------------------------------------ |
| |0 |NESTED-LOOP JOIN CARTESIAN | |398 |14 | |
| |1 |├─FUNCTION_TABLE |FUNC_TABLE1|199 |1 | |
| |2 |└─MATERIAL | |2 |2 | |
| |3 | └─TABLE FULL SCAN |T1 |2 |2 | |
| ================================================================== |
| Outputs & filters: |
| ------------------------------------- |
| 0 - output([T1.C1], [RANDOM(cast(1, BIGINT(-1, 0)))]), filter(nil), rowset=256 |
| conds(nil), nl_params_(nil), use_batch=false |
| 1 - output(nil), filter(nil) |
| value(GENERATOR(cast(3, BIGINT(-1, 0)))) |
| 2 - output([T1.C1]), filter(nil), rowset=256 |
| 3 - output([T1.C1]), filter(nil), rowset=256 |
| access([T1.C1]), partitions(p0) |
| is_index_back=false, is_global_index=false, |
| range_key([T1.__pk_increment]), range(MIN ; MAX)always true |
+----------------------------------------------------------------------------------+
19 rows in set
obclient> SELECT /*+ PARALLEL(2) */ c1, RANDOM(1) FROM t1, TABLE(GENERATOR(3));
+------+----------------------+
| c1 | random(1) |
+------+----------------------+
| 1 | -6753783847308464280 |
| 2 | -6707106347154343346 |
| 1 | -899926183391115878 |
| 2 | -8835543475904200562 |
| 1 | -2750444335953844424 |
| 2 | 7588216632478230601 |
+------+----------------------+
6 rows in set
obclient> EXPLAIN SELECT /*+ PARALLEL(2) */ c1, RANDOM(1) FROM t1, TABLE(GENERATOR(3));
+----------------------------------------------------------------------------------+
| Query Plan |
+----------------------------------------------------------------------------------+
| ================================================================== |
| |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| |
| ------------------------------------------------------------------ |
| |0 |NESTED-LOOP JOIN CARTESIAN | |398 |13 | |
| |1 |├─FUNCTION_TABLE |FUNC_TABLE1|199 |1 | |
| |2 |└─MATERIAL | |2 |3 | |
| |3 | └─PX COORDINATOR | |2 |3 | |
| |4 | └─EXCHANGE OUT DISTR |:EX10000 |2 |2 | |
| |5 | └─PX BLOCK ITERATOR | |2 |1 | |
| |6 | └─TABLE FULL SCAN |T1 |2 |1 | |
| ================================================================== |
| Outputs & filters: |
| ------------------------------------- |
| 0 - output([T1.C1], [RANDOM(cast(1, BIGINT(-1, 0)))]), filter(nil), rowset=256 |
| conds(nil), nl_params_(nil), use_batch=false |
| 1 - output(nil), filter(nil) |
| value(GENERATOR(cast(3, BIGINT(-1, 0)))) |
| 2 - output([T1.C1]), filter(nil), rowset=256 |
| 3 - output([T1.C1]), filter(nil), rowset=256 |
| 4 - output([T1.C1]), filter(nil), rowset=256 |
| dop=2 |
| 5 - output([T1.C1]), filter(nil), rowset=256 |
| 6 - output([T1.C1]), filter(nil), rowset=256 |
| access([T1.C1]), partitions(p0) |
| is_index_back=false, is_global_index=false, |
| range_key([T1.__pk_increment]), range(MIN ; MAX)always true |
+----------------------------------------------------------------------------------+
26 rows in set