Skip to content

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 자동 생성세 번째 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이나 소스 검증을 모두 생략해 주는 옵션도 아닙니다. 두 간격 컬럼은 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인 세 행이 조회됩니다.

EXTENSION 자동 생성은 WITH ROLLUP (SEC) EXTENSION 형태입니다. 실제 생성 이름은 V$ROLLUP에서 확인하고, 이름 충돌을 자동으로 해소한다고 가정하지 않습니다.

인자에 따라 만들어지는 계층이 달라집니다. (SEC)는 SEC·MIN·HOUR 세 개를, (MIN)은 MIN·HOUR 두 개를, (HOUR)는 HOUR 하나를 만들며, 인자를 생략하면 (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 레퍼런스를 참고합니다.

최근 업데이트