Posting

Machbase의 최신 소식을 지금 만나보세요

[MACHBASE 기초] 최근 입력 데이터 조회

마크베이스는 스마트팩토리를 구축함에 있어서 설비에서 발생하는 센서 데이터를 빠르게 저장하고 검색할 수 있는 시계열 DBMS 이다.
마크베이스 버전 5 부터는 이러한 태그 데이터를 위한 전용 테이블인 TAG 테이블 기능이 포함되어 있어서 쉽게 데이터를 입력하고 조회할 수 있게 되었다.
설비로 부터 발생하는 센서데이터를 PLC를 통해서 데이터를 수집하여 마크베이스 DB에 입력하고 나서 조회할 때
각 센서별로 가장 최근에 입력된 데이터를 조회하여 분석화면에 표시하고자 하는 경우  데이터를 저장하고 조회하는 방법에 대해서 설명한다.
1개 센서에 대해서는 시간별로 정렬해서 LIMIT 1로 구하거나, 최근에 구현된 backward scan 기능을 이용하면 결과값을 구할 수 있지만,
여러 개 센서에 대해서 한번에 마지막 입력값을 구하고자 할 때는 아래에 제안하는 방법을 고려해볼 수 있다.

제안 방법은 모든 경우에 대해서 사용할 수 있는 것이 아니라, 몇가지 전제 조건하에서 가능한 방법으로 
요점은 데이터를 입력할 때  별도의 LOOKUP 테이블을 생성하고 여기에 마지막 입력 데이터의 시간값을 지속적으로 업데이트하여 관리하면서
데이터를 조회할 때 마지막 입력 시간값을 구한 다음에 이 값으로 TAG 테이블에 입력된 데이터를 조회하는 방법이다.

전제조건

– 제조공장에 생산 설비가 10 대 있고, 각 설비마다 20개의 센서가 부탁되어 있다.
– 설비명은 equip01, equip02, equip03, … 으로 하고, 태그명은 tag001, tag002, tag003, …. 으로 한다.
– PLC를 통해서 200ms 로 데이터를 수집한다.
– 데이터는 아래와 같이 주기적으로 설비로 부터 동일 시각으로 태그를 수집한다.

2019-10-05 12:27:32.542,equip01,tag001,26.216017188,4
2019-10-05 12:27:32.542,equip01,tag002,95.1460536686,1
2019-10-05 12:27:32.542,equip01,tag003,66.1602503844,1
2019-10-05 12:27:32.542,equip01,tag004,57.4653195742,5
2019-10-05 12:27:32.542,equip01,tag005,66.4480873797,8
...
2019-10-05 12:27:32.742,equip02,tag001,3.97672471386,4
2019-10-05 12:27:32.742,equip02,tag002,11.3633560269,9
2019-10-05 12:27:32.742,equip02,tag003,74.2960149443,1
2019-10-05 12:27:32.742,equip02,tag004,46.3407099637,9
2019-10-05 12:27:32.742,equip02,tag005,55.0290986306,1
...
2019-10-05 12:27:32.943,equip03,tag001,85.6358069168,2
2019-10-05 12:27:32.943,equip03,tag002,65.376551978,6
2019-10-05 12:27:32.943,equip03,tag003,33.9658368002,10
2019-10-05 12:27:32.943,equip03,tag004,62.655866591,10
2019-10-05 12:27:32.943,equip03,tag005,95.6945550563,3
...

TAG 테이블 스키마

여기에 사용된 TAG 테이블과 데이터는 지난 번 게시글인 TAG 테이블 칼럼 확장 방법에 사용된 것을 그대로 이용한다.
(https://www.machbase.com/kr/howtouse/?uid=109&mod=document&pageid=1 )
TAG 테이블은 TAG_ID, TIMESTAMP, VALUE 3개 칼럼을 기본으로 하고 있다. 필요한 경우 메타 칼럼과 데이터 칼럼을 추가하여 사용할 수도 있다.
여기서는 설비명과 태그명을 메타 칼럼으로 구성하고 , TAG_ID는 Primary Key 속성이 있으므로 “설비명_태그명”으로 구성한다.

CREATE TAGDATA TABLE TAG
(
   TAG_ID         VARCHAR(40) PRIMARY KEY,
   TIMESTAMP      DATETIME    BASETIME,
   VALUE          DOUBLE      SUMMARIZED,
   QUALITY        INTEGER
)
METADATA
(
   EQUIPMENT     VARCHAR(16),
   TAG_NAME      VARCHAR(16)
);

Mach> desc tag;
[ COLUMN ]
----------------------------------------------------------------------------------------------------
NAME        TYPE        LENGTH
----------------------------------------------------------------------------------------------------
TAG_ID      varchar     40
TIMESTAMP   datetime    31
VALUE       double      17
QUALITY     integer     11
[ META-COLUMN ]
----------------------------------------------------------------------------------------------------
NAME TYPE LENGTH
----------------------------------------------------------------------------------------------------
EQUIPMENT   varchar     16
TAG_NAME    varchar     16

이렇게 테이블을 구성하는 경우 최근 입력된 데이터를 조회하는 SQL 구문을 아래와 같이 생각해 볼 수 있다.
즉, 1개 태그를 이용하여 MAX(TIMESTAMP)를 구해서 최근 입력 시간을 가져와서 이 시간값을 이용하여 필요한 데이터를 조회하는 방식이다.

SELECT EQUIPMENT, TAG_NAME, TIMESTAMP, VALUE FROM TAG
WHERE EQUIPMENT = 'equip01'
AND TAG_NAME IN ('tag001', 'tag005', 'tag009', 'tag011', 'tag012', 'tag015')
AND TIMESTAMP = (SELECT MAX(TIMESTAMP) FROM TAG WHERE TAG_ID = 'equip01_tag001' );

이렇게 할 경우 다음과 같은 문제가 발생할 가능성이 있다.
– 만약 특정 태그인 equip01_tag001 이 매번 입력되는 것이 아니라면, MAX(TIMESTAMP) 값은 최근 입력 시간이 아닐 수 있게 된다.
– max(timestamp)를 구하는 도중에 새로운 레코드가 입력될 수 있다.
– 나노초 단위에서는 max(timestamp)를 구하는 시간이 300ms 이면 이미 다른 값이 들어간다.

제안 방법

현재의 TAG 테이블 기능상으로는 최근에 입력된 20개의 태그 데이터를 한꺼번에 조회할 방법은 없다.따라서 별도의 LOOKUP 테이블을 이용하여 가장 최근에 입력된 시간값을 업데이트하면서 이 값을 이용하여 TAG 테이블을 조회하여야 한다.

1) TAG_TIME 테이블 생성

설비별 최근 데이터 시간과 실제 서버에 입력한 시간을 기록하는 LOOKUP 테이블을 생성한다.설비별 부착된 모든 태그의 시간은 동일한 경우에는 설비별로 시간을 관리하면 되며,만약 태그별로 모두 달라지는 경우에는 설비와 태그 조건으로 시간을 관리해야 한다.

CREATE LOOKUP TABLE TAG_TIME(   
    EQUIPMENT    VARCHAR(20) PRIMARY KEY,    
    LATEST_TIME  DATETIME,    // 데이터 발생 시간    
    LAST_UPTIME  DATETIME     // 서버 입력 시간
);

2) 데이터 입력

데이터를 입력하는 클라이언트의 데이터 입력 프로그램에서 20 개 태그를 모두 입력 완료한 시점에 TAG_TIME 테이블을 업데이트 한다.
데이터 입력 프로그램에서 작성하는 PSEUDO 코드는 아래와 같다.

-- 특정 설비의 최근 입력된 데이터의 시간을 구한다.
SELECT LATEST_TIME FROM TAG_TIME WHERE EQUIPMENT = 'equip01';

-- 입력시간값이 최근 입력된 데이터의 시간값보다 큰 경우에는  둘다 업데이트한다.
IF :CURRENT_TIME > LATEST_TIME //정상값   
    update latest_time and last_uptime
-- 과거 데이터 시간값으로 이 경우에는 서버 입력 시간만 업데이트한다. 
ELSE //과거값    
    update last_uptime only 

3) 데이터 조회
최근 입력 시간을 조회할 때는 TAG_TIME의 LATEST_TIME  값을 구해서 TAG 테이블의 TIMESTAMP와 비교해서 조회한다.

SELECT EQUIPMENT, TAG_NAME, TIMESTAMP, VALUE FROM TAG
WHERE EQUIPMENT = 'equip01'
AND TAG_NAME IN ('tag001', 'tag005', 'tag009', 'tag011', 'tag012', 'tag015')
AND TIMESTAMP = (SELECT LATEST_TIME FROM TAG_TIME WHERE EQUIPMENT = 'equip01' );

마무리

지금까지 TAG 테이블에 데이터를 입력하면서 가장 최근에 입력된 태그 데이터를 조회하는 방법에 대해서 알아보았다.동일한 시간값으로 20개 태그를 입력하는 경우 최근 입력된 시간값을 저장하고 있는 별도의 LOOKUP 테이블을 이용하여 최신 입력 데이터를 조회하면 된다. 향후에는 LOG 테이블의 _RID 처럼 TAG 테이블만 이용하여 조회가능한 기능을 지원하게 되면 좀 더 편리하게 사용할 수 있을 것이다.

연관 포스트

C언어로 Binary data를 Machbase에 넣기

1.개요 Data를 다루다 보면 numeric, varchar 형 데이터뿐만 아니라 JPG, PNG, MP3와 같은 Binary data도 database에 저장해야 할 때가 존재한다. 그러나 일반 data들과는 달리 Binary

[MACHBASE 연동] Android studio에서 JDBC 연결하기

마크베이스 기술지원본부 이현민 1. 개요 수많은 데이터들이 많은 환경에서 생성되고 있는 오늘날, 우리 현대인들의 동반자인 스마트폰 또한 데이터생성의 주체로써 또는 전달자로서 알게 모르게 그 구실을