데이터베이스에 다양한 필드 수를 사용하여 측정값을 저장하는 가장 효율적인 방법은 무엇입니까?
문제
우리는 강이나 수로를 통해 흐르는 물의 속도를 측정하는 환경 센서로부터 측정값을 수집하는 데이터 수집 시스템을 보유하고 있습니다.각 측정은 고정된 수의 값을 생성합니다(예:날짜, 시간, 온도, 압력 등) 및 속도 값 목록.
원래 센서는 세 가지 속도 값을 제공했기 때문에 FireBird 데이터베이스에 있는 단일 테이블의 자체 열에 각 값을 저장했습니다.나중에 최대 9개의 속도 값을 출력할 수 있는 센서가 도입되었으므로 간단히 6개의 열을 추가했습니다.대부분의 센서가 9개 미만의 값을 사용하더라도 대부분의 열에 0만 포함되어 있으면 문제가 되지 않을 것이라고 생각했습니다.
그러나 이제 나는 1에서 256까지의 값을 출력할 수 있는 새로운 세대에 직면하고 있으며 특히 대부분의 측정값에는 여전히 3에서 9까지의 값만 포함되므로 247개의 열을 추가하는 것은 그리 효율적이지 않을 것이라고 가정합니다.
측정값은 10분마다 수집되고 데이터베이스에는 30~50개 센서에 대한 모든 데이터가 포함되어 있으므로 몇 년이 지나면 총 데이터 양이 상당히 커집니다. 그러나 임의의 기간에 대한 개요/그래프를 생성할 수 있어야 합니다.
그렇다면 변수 값 목록을 저장하는 가장 효율적인 방법은 무엇일까요?
각 레코드에는 고유 ID가 있으므로 모든 속도 값을 별도의 테이블에 저장할 수 있다고 가정합니다. 각 값에는 레코드 ID 태그가 지정됩니다.나는 이것이 그다지 효율적이지 않을 것이고 시간이 지나면 매우 느려질 것이라는 느낌을 받았습니다.
해결책
효율적인 인덱스를 사용하면 데이터베이스에서 테이블의 많은 양의 데이터를 처리할 수 있습니다.따라서 다음 테이블 구조를 사용할 수 있습니다.
create table measurements (
id,
seq integer, -- between 1 and 256
ts timestamp, -- Timestamp of the measurement
value decimal(...)
)
다음에 대한 색인 생성 id
, id, seq
그리고 ts
.그러면 데이터를 효율적으로 검색할 수 있습니다.데이터베이스를 신뢰할 수 없다면 수백만 개의 행을 삽입하고 몇 가지 선택을 실행하여 얼마나 잘 작동하는지 확인하십시오.
비교하려고:여기에 1억 1,200만 개의 행이 있는 Oracle 데이터베이스가 있고 120ms(0.12초) 이내에 타임스탬프 또는 ID로 레코드를 선택할 수 있습니다.
다른 팁
텍스트 필드에 직렬화 된 데이터를 저장할 수 있습니다 (예 : json-encoding).
[<velocity-value-1>, <velocity-value-2>, ...]
그런 다음 코드에서 쿼리 후 값을 조정하십시오.
저장된 값이 아닌 다른 필드로 쿼리를 필터링하는 경우에도 잘 작동합니다. 값으로 필터를 사용하는 경우 WHERE
조항은 악몽이 될 것입니다.
두 번째 테이블과 함께 갈 것입니다.
table measurements (Id, DateTime, Temperature, Pressure)
table velocity (Id, MeasurementId, Sequence, Value)
Velocity.MeasurementId
참조 Measurements.Id
.
Velocity.Sequence
해당 측정의 속도 값의 색인 (1-256)입니다.
이러한 테이블을 가능한 한 실제와 가까운 데이터로 채우고 SQL 문을 테스트하여 최상의 인덱스를 찾으십시오.