コンテンツにスキップ

6.3 ROLLUPの作成と削除

作成構文

CREATE ROLLUP [IF NOT EXISTS] name
  ON source_tag [(column_or_json_path)]
  INTERVAL n (SEC|MIN|HOUR)
  [WAKEUP INTERVAL m (SEC|MIN|HOUR)]
  [EXTENSION]
  [WHERE predicate];

CREATE ROLLUP [IF NOT EXISTS] name
  FROM source_rollup
  INTERVAL n (SEC|MIN|HOUR)
  [WAKEUP INTERVAL m (SEC|MIN|HOUR)]
  [EXTENSION]
  [WHERE predicate];

EXTENSIONの後に別の拡張名は指定しません。CREATEの単位はSEC/MIN/HOURであり、 クエリ関数のDAY/MONTHなどとは区別します。間隔は正数で、現在の検証上限は365日に相当する間隔です。 ソース・階層・集計モードの条件も満たす必要があります。

対象条件
通常の数値カラムサポートされる数値型を指定。SUMMARIZEDは必須ではない
JSONパス対象のJSONカラムと有効なパスを指定
JSONドキュメント全体JSON SUMMARIZEDカラムが必要
WITH ROLLUPによる自動作成3番目にSUMMARIZEDカラムが必要
METADATA・距離軸・TAG以外通常のROLLUPの対象外

作成・重複確認・検索の実習

CREATE TAG TABLE ch6_create (
    name VARCHAR(32) PRIMARY KEY,
    time DATETIME BASETIME,
    value DOUBLE,
    quality INTEGER
);
CREATE ROLLUP IF NOT EXISTS ch6_create_ru ON ch6_create(value) INTERVAL 1 MIN;
CREATE ROLLUP IF NOT EXISTS ch6_create_ru ON ch6_create(value) INTERVAL 1 MIN;
INSERT INTO ch6_create VALUES ('TEMP_01', TO_DATE('2026-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 10.0, 1);
INSERT INTO ch6_create VALUES ('TEMP_01', TO_DATE('2026-01-01 00:00:30', 'YYYY-MM-DD HH24:MI:SS'), 20.0, 1);
INSERT INTO ch6_create VALUES ('TEMP_01', TO_DATE('2026-01-01 00:01:00', 'YYYY-MM-DD HH24:MI:SS'), 30.0, 1);
INSERT INTO ch6_create VALUES ('TEMP_02', TO_DATE('2026-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 100.0, 1);
EXEC TABLE_FLUSH(ch6_create);
ALTER ROLLUP ch6_create_ru FORCE;
SELECT DISTINCT ROLLUP_NAME, COLUMN_NAME, INTERVAL_TIME, WAKEUP_INTERVAL
  FROM V$ROLLUP WHERE ROLLUP_NAME = 'CH6_CREATE_RU';
SELECT rollup('min', 1, time) AS bucket, AVG(value)
  FROM ch6_create WHERE name = 'TEMP_01'
 GROUP BY bucket ORDER BY bucket;

同名で再作成しても既存の定義は保持されます。IF NOT EXISTSは定義の変更や同一性の確認機能ではなく、 不正なSQLやソースの検証をすべて省略するオプションでもありません。 2つの間隔カラムは60000msで、検索結果の平均は00:00が15、00:01が30です。

IF NOT EXISTSなしで同じ名前を作成するとエラーになります。通常の実習とは別に確認してください。

CREATE ROLLUP ch6_create_ru ON ch6_create(value) INTERVAL 1 MIN;

WITH ROLLUPによる自動作成

次は別のテーブルです。SECからMIN・HOURまでの基本階層を自動作成します。

CREATE TAG TABLE ch6_auto (
    name VARCHAR(32) PRIMARY KEY,
    time DATETIME BASETIME,
    value DOUBLE SUMMARIZED
) WITH ROLLUP (SEC);
SELECT DISTINCT ROLLUP_NAME, ROOT_TABLE, INTERVAL_TIME, EXT_TYPE
  FROM V$ROLLUP WHERE ROOT_TABLE = 'CH6_AUTO'
 ORDER BY INTERVAL_TIME;

INTERVAL_TIMEが1000・60000・3600000の3行が返されます。

EXTENSIONの自動作成はWITH ROLLUP (SEC) EXTENSION形式です。 実際の作成名はV$ROLLUPで確認し、名前の競合が自動的に解消されるとは考えないでください。

引数に応じて作成される階層が異なります。(SEC)はSEC・MIN・HOURの3つ、(MIN)はMIN・HOURの2つ、 (HOUR)はHOURを1つ作成します。引数の省略は(SEC)と同じです。 このとき、最初の段階だけが元のTAGをソースとし、次の段階は直前のROLLUPをソースとする階層で接続されます。 引数にはSEC・MIN・HOURのみ使用でき、クエリ関数が受け付けるDAYなどの単位を指定するとエラーになります。

削除と定義変更

他のROLLUPが参照するソースは、上位の依存オブジェクトから削除します。 Customの出力先TAGは、ジョブを削除するまでDROPできません。 定義を変更する場合は、読み取り側アプリケーションと再集計時間を考慮し、新しいオブジェクトへ切り替えるか、既存の定義を削除して再作成します。

DROP ROLLUP ch6_create_ru;
DROP TABLE ch6_create;
DROP TABLE ch6_auto CASCADE;

最後のCASCADEは、この実習で自動作成したROLLUPも削除します。通常の運用での削除方法のデフォルトにはしないでください。 CustomソースのCASCADEが関連ジョブを削除しても、ユーザーの出力先TAGまで自動削除するという意味ではありません。

条件付き・拡張・JSON・Customの実習は各節で独立して提供します。 完全な構文はSQLリファレンスを参照してください。

最終更新日