우리는 실행하는 데이터베이스를 백업한 웹 응용 프로그램를 위한 데이터 분석을 기반으로 현재 C#.NET EntityFramework 하고,서버에서 주로 HTML+Javascript 프레임워크에서 클라이언트 측의(웹 기반).
우리의 응용 프로그램 정기적으로 받은 측정 X/Y 데이터 포인트에서 일괄 처리량,즉 1e6 나 이상의 업로드,사용자에 의해 또는 받는 다른 인프라가 있습니다.
현재 우리는 테이블에서 MSSQL 라 Values
가 id, series_id as int; x, y, z as float
. 이 테이블은 BULK INSERT
으로 가득 할 때 데이터는 클라이언트에 업로드,그리고 관련된 메타데이터에 저장됩 Series
테이블. 총 db 크기는 현재 접근 1TB,99.99%의 Values
데이터입니다.
이 접근 방식이 구현하는 간단하지만 그것은 여러 단점을 만든 그것이 복잡하고 시간이 느리게:
- 우리는 삽입에 덩어리를 하중 초과하지 않는 IIS 프로세스는 전처리 그것은(현재 200'000 데이터 포인트는 당 덩어리)
- IIS 프로세스 메모리 요구 사항 중에 삽입하는 거대(>1500MB200MB 의 데이터)
- 삽입이 너무 느리게(5 백만 기록은 100MB 이>30 초 삽입도를 사용하여 대량 삽입)
- 안을 삽입합체 테이블 잠금,즉 하나의 사용자 삽입할 수 있는 시간
- 검색하는 데이터는 또한 매우 느리게,요청 1e6 기록을 때 10 초
- 삭제하시리즈>1e6 기록 정기적으로 원인 시간 제한 웹 응용 프로그램 측.
데이터는 결코 부분적으로 선택되면,그래서 우리가 정말 필요 없어 그것을 가지고 있습니다. 그러나 그것은'희석한'표시하기 전에 보내는 클라이언트,즉,1e6 기록은 기본적으로,즉 99%의 사용 사례를 감소하 2000 10'000 기록하기 전에 클라이언트로 보내집니다. 이것은에 캐시 클라이언트,하지만 경우에 새로운 클라이언트 요청을 같은 설정,그것은 다시 처리. 값 테이블 또는 인덱스 series_id
는 것보다 더 많은 디스크 공간 테이블에 자체입니다.
나는지 궁금 것은 의미가 변경이 저장 형식 BLOB 저장소에서"값을"자신의 데이터 형식(CSV 또는 JSON 또는 바이너리),그리고 어쩌면-추가 열처리된'감소'한 데이터세트를 표시할 수 있는 푸시 클라이언트 없이 변경(예를 들어. JSON). 그래서 새로운 Values
테이블 형식의 것
id, series_id, data(blob), reduced_data(blob)
고 있는 것 하나만 Value
당 Series
엔지 1e6 나 더 있습니다. 감소된 데이터 집합이 만들 때 한 번 업로드된 데이터를 받은 다음 표시에 사용할 때 클라이언트가 요청
나는 부분을 선택의 values
ID 또는 X/Y 값,그러나 값이 없에 따라 선택 이외의 아무것도 id
나 series_id
그래서 이것은 현재 하지 않에 제한이 있습니다. 그래서 여기에 제 질문:
- 이 말에는 모든? 내가 예상 생성 및 삭제의 큰 BLOB 데이터세트를 항상보다 훨씬 빠르게 생성 및 삭제 1,000,000 단일 기록합니다. 사실인가요?
- 이진 덩어리 또는 CSV/JSON/..BLOB? 가장 간단한 방법에 대한 BLOB 저장은 물론을 만드는 거대한 CSV 또는 JSON 덩어리에 저장(아마도 gzip 으로 압축)데이터베이스에서. 사용자 지정 데이터는 바이너리 형식의 것 심지어 작은,하지만 그것이 될 수 있는 것을 변환하 JSON 하기 전에 보낸 클라이언트입니다.
나는 느낌을 추가적인 번거로움으로 오는 데이터는 바이너리 형식의 가치가 되지 않을 수도 있습니다 그것은 그것의 더 나은 gzip 으로 CSV/JSON blob 보를 발명하는 바이너리 형식입니다. 사실인가요?
는 방법에 대해 다른 단점의 덩어리가 알지 못할 수도 있습니까? 크기 제한하지 않는 것이 문제가 될, varbinary(MAX)
충분합니다. 내가 필요로 하지 않는 인덱스에서 값 내부 blob,단지에는 메타데이터(이 시리즈에서 테이블).
생각?