거대한 센서 배열에서 데이터 샘플을 저장하는 솔루션 (app 및 db)을 구현해야했습니다. 이 어레이는 현재 약 20,000 개의 센서로 구성되어 있지만 곧 최대 100,000 개의 센서로 확장 될 것입니다. 각 센서는 10 초마다 데이터 샘플을 전송하며 각 샘플의 크기는 28 바이트입니다.
따라서 합계를 수행하면 다음이 발생합니다.
- 하루에 센서 당 8640 개의 샘플
- 하루에 센서 당 242kB의 데이터
- 일일 864 백만 샘플
이제 데이터를 저장 / 검색하는 가장 좋은 방법이 무엇인지 궁금했습니다. 소프트웨어가 이미 지정된 후에이 프로젝트에 "참여"되었으므로 SQL Server를 사용하여 Windows 플랫폼에서 구현해야합니다.
내 머리 속에있는 현재 솔루션은 데이터 샘플을 저장하기 위해 두 개의 테이블이있는 DB를 만드는 것입니다. 첫 번째는 두 번째로 정렬 된 인덱스의 역할을하며, 한 번에 센서 단위로 이진 필드에 대조 된 샘플을 저장합니다.
Table 1:
RecordID - BigInt - Identity
SensorID - BigInt - Primary Key
Date - DateTime - Primary Key (yyyy-mm-dd)
Table 2:
RecordID - BigInt - Primary Key (from an insert into Table 1)
Data - Binary
기본적으로 모든 센서의 샘플을 임시 파일 (센서 당 1 개)에 씁니다. 하루가 끝나면 표 1에 항목을 생성하고 생성 된 RecordID를 사용하여 파일을 표 2의 데이터 필드에 덤프합니다.
이 방법으로 매일 8 억 8 천 5 백만 개의 항목이 아닌 하루 10 만 개의 항목이 테이블에 입력됩니다. LAN 또는 고속 WAN에서 데이터를 사용할 수 있어야하므로 하루 종일 센서 데이터를 검색 할 수 있습니다.
모든 데이터를 저장해야하지만 대부분의 데이터를 읽지 못할 수 있습니다. 따라서 테이블에 대한 읽기 양은 쓰기보다 크게 많지 않습니다.
데이터 파일의 경로를 저장하여 파일 시스템을 사용하여 무언가를 구현할 수 있다는 것을 알고 있지만 이진 필드는 256kB보다 덜 감사하는 동안 SQL Server가 NTFS보다 성능이 뛰어납니다. (회색 영역은 256kB와 1MB 사이이며 NTFS는 이진 크기가 1MB보다 큰 경우 SQL Server보다 성능이 뛰어납니다.)
또한 폴더에 많은 양의 파일이 있거나 각 폴더에 몇 개의 파일이있는 복잡한 트리 구조를 가짐으로써 파일 시스템에서 문제를 일으키지 않고 100,000 센서의 데이터를 자체 파일에 저장하는 것에 약간 조심합니다. 파일 조각화도 고려합니다.
누구든지 위의 실용적인 조언 / 의견을 제공 할 수 있습니까?
내가 빠질 명백한 함정이 있습니까?
샘플 데이터는 상당히 잘 압축됩니다. 242kB 파일은 약 85kB로 압축됩니다. 그러나 샘플 데이터 (열)가 자동으로 압축되도록 데이터베이스 수준에서 일부 압축 유형을 구현할 수 있습니까?
이 프로젝트에서 SQL Server가 분명히 잘못된 선택입니까?
두 테이블의 디자인이 현명합니까, 아니면 두 테이블처럼 여전히 "성능이있는"단일 테이블로 결합 할 수 있습니까?