コンテンツにスキップ

6.9 ROLLUPの制御と状態確認

ジョブの状態と処理完了

ROLLUPは作成時に自動的に開始します。直後にSTARTを繰り返したり、停止済みのジョブに再度STOPを実行したりすると、状態エラーが発生する場合があります。 次の実習では、作成 → STOP → 入力 → START → WAKEUP → FORCEの順に状態を区別します。

CREATE TAG TABLE ch6_control (
    name VARCHAR(32) PRIMARY KEY,
    time DATETIME BASETIME,
    value DOUBLE,
    quality INTEGER
);
CREATE ROLLUP ch6_control_ru ON ch6_control(value)
  INTERVAL 1 MIN WAKEUP INTERVAL 10 SEC;
ALTER ROLLUP ch6_control_ru STOP;
INSERT INTO ch6_control VALUES ('TEMP_01', TO_DATE('2026-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 10.0, 1);
INSERT INTO ch6_control VALUES ('TEMP_01', TO_DATE('2026-01-01 00:00:30', 'YYYY-MM-DD HH24:MI:SS'), 20.0, 1);
INSERT INTO ch6_control VALUES ('TEMP_01', TO_DATE('2026-01-01 00:01:00', 'YYYY-MM-DD HH24:MI:SS'), 30.0, 1);
INSERT INTO ch6_control VALUES ('TEMP_02', TO_DATE('2026-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 100.0, 1);
EXEC TABLE_FLUSH(ch6_control);

SELECT DISTINCT ROLLUP_NAME, ENABLED, INTERVAL_TIME, WAKEUP_INTERVAL
  FROM V$ROLLUP WHERE ROLLUP_NAME = 'CH6_CONTROL_RU';

ALTER ROLLUP ch6_control_ru START;
ALTER ROLLUP ch6_control_ru WAKEUP;
ALTER ROLLUP ch6_control_ru FORCE;

SELECT rollup('min', 1, time) AS bucket, AVG(value)
  FROM ch6_control WHERE name = 'TEMP_01'
 GROUP BY bucket ORDER BY bucket;

停止状態のENABLEDは0、INTERVAL_TIMEは60000ms、WAKEUP_INTERVALは10000msです。 最後のクエリは、TEMP_01の00:00の平均15と00:01の平均30を返します。

コマンド目的完了の意味
STOPジョブを停止以後の未処理入力は残る
START停止したジョブを再開処理位置から続行
WAKEUPジョブを起動処理完了は待たない
FORCE対象ソースの処理範囲に追いつくまで待機過去の修正分の再計算や将来の入力完了ではない
ROLLUP_REBUILDサポート対象の過去バケットを再計算元データの補正後に集計を再構築

SQL ALTERの代わりに、名前を指定したEXEC ROLLUP_START(name)ROLLUP_STOP(name)ROLLUP_FORCE(name)も使用できます。同じ状態遷移を両方の形式で続けて実行しないでください。 名前を指定しない一括制御と、特定ジョブの制御の範囲を混同しないでください。

WAKEUP INTERVAL

省略時は作成時のINTERVALと同じです。正数で、集計間隔以下であり、集計間隔を割り切れる値にする必要があります。 起動頻度を高めると遅延を減らせますが、処理負荷も増加します。

ALTER ROLLUP ch6_control_ru SET WAKEUP INTERVAL 5 SEC;
SELECT DISTINCT ROLLUP_NAME, INTERVAL_TIME, WAKEUP_INTERVAL
  FROM V$ROLLUP WHERE ROLLUP_NAME = 'CH6_CONTROL_RU';

WAKEUP_INTERVALが5000msになります。次は60秒の約数でない値を使う意図的なエラーです。

ALTER ROLLUP ch6_control_ru SET WAKEUP INTERVAL 7 SEC;

V$ROLLUPの読み方

カラム意味
ROLLUP_NAME制御するジョブ名
ROLLUP_TABLE集計先テーブル。Customではユーザーの出力先TAG
SOURCE_TABLE, ROOT_TABLE直接のソースと、ジョブを解釈するための元データの関係
COLUMN_NAME通常集計・パス集計の対象カラム
INTERVAL_TIME, WAKEUP_INTERVALミリ秒単位の作成間隔・実行間隔
LAST_WAKEUP_TIME, NEXT_WAKEUP_TIME直前の起動時刻と次の予定時刻
EXT_TYPE0: 通常、1: 拡張、2: Custom
PREDICATE通常の条件式、またはCustomのSELECT本文
ENABLEDジョブの有効状態
RUN_STATEI: 初期、S: 待機、R: 処理中
END_RIDソースの処理位置
LAST_ELAPSED_MSEC直前の処理時間(ms)
DATABASE_NAME, USER_IDデータベース・所有者の識別
SELECT ROLLUP_NAME, ROLLUP_TABLE, SOURCE_TABLE, ROOT_TABLE,
       INTERVAL_TIME, WAKEUP_INTERVAL, LAST_WAKEUP_TIME, NEXT_WAKEUP_TIME,
       ENABLED, RUN_STATE, LAST_ELAPSED_MSEC
  FROM V$ROLLUP WHERE ROLLUP_NAME = 'CH6_CONTROL_RU'
 ORDER BY ROLLUP_NAME;
SHOW ROLLUPGAP;

SHOW ROLLUPGAPはmachsql専用のクライアントコマンドです。SDKの通常のSQL APIには送信しないでください。 GAPはソースとROLLUPの処理RIDの差です。時間遅延そのものではなく、すべての階層・関連ノードの状態と併せて確認します。 gap=0でも、集計済みの元データに対する補正が反映されたとは限りません。 継続入力中の値は観測時点で変わるため、再現実習では入力を止めて比較します。

停止中に元データが保持ポリシーで削除された場合、STARTだけでは復元できません。 FORCEは下位から上位の順に実行し、失敗したら最初のエラー、状態、ソースにアクセス可能かを確認してください。

クリーンアップ

DROP ROLLUP ch6_control_ru;
DROP TABLE ch6_control;

詳細なコマンド仕様はEXECリファレンスROLLUPのトラブルシューティングを参照してください。

最終更新日