2012-10-17 4 views
0

내 질문은이 하위 질문이 있습니다 대형 데이터 세트 매핑

  1. 마다 두 번째 내가 키/값 튜플의 집합으로 표현되는 데이터를 수신 곳의는 경우를 가정 해 봅시다합니다. 각 값은 기본적으로 64 비트 카운터입니다. 데이터베이스에 저장해야합니다. 값의 수는 수천 개입니다. 그 중 수천 만 명 중 1 %만이 실제 데이터를 가지고 있고, 다른 것들은 널 (희박하게 채워진 집합)입니다. 수천 개의 기둥을 만드는 것이 합리적입니까? 또는 "ID, 타임 스탬프, 키, 값"으로 저장 하시겠습니까?

  2. 질문 1에 대한 답변이 "수천 개의 열"인 경우 mysql/postgres 패밀리의 da는 사용해야합니까?

이 사례에 대한 읽기 패턴은 주로 차트 작업이므로 select는 타임 스탬프를 기반으로 한 데이터 묶음입니다. 따라서 일정한 1/초 쓰기와 날짜/시간 범위의 모든 데이터 또는 데이터의 비정기적인 읽기입니다.

보너스 질문, NoSQL 데이터베이스에 이러한 데이터를 저장하는 데 사용할 수있는 보너스 질문은 무엇입니까? 예를 들어, MongoDB에서는 전체 세트의 1 % 만있는 문서를 포함하는 통계 모음을 사용할 수 있습니다. 어떻게하면이 경우에 read/map/reduce와 함께 작동할까요? 어떻게 데이터를 읽는 것이 mysql/postgres와 비교 될까요?

편집 : 내 유스 케이스는 대신 (드문 드문 더 큰 세트에서 인구) 내가 훨씬 더 큰 데이터 세트를 작은 데이터 세트를 많이 갖는 미만 자주 (적은 사용자)

답변

1

PostgreSQL은 null 열을 비트 맵으로 저장하지만 각 행마다 큰 오버 헤드가 있습니다. 두 개의 저장 방식의 저장 효율을 계산할 수 :

Average row length for wide table with thousands of columns: 
23 bytes row header + 1000*1bit + average 2 bytes of alignment + 4 bytes id 
    + 8 bytes timestamp + 10*8 bytes values = 242 bytes 

Average number of bytes for storing each value separately: 
10 values * (23 bytes row header + 1 byte alignment + 4 bytes id 
    + 8 bytes timestamp + 4 bytes key + 8 bytes value) = 480 bytes 

그래서 천 열은 키에 의해 그것을 분할 배 정도 효율적입니다. 키를 별도로 저장하는 것이 더 효율적인 크로스 오버 포인트는 about 0.45%입니다.

그러나이 방법은 매우 확장되지 않습니다. PostgreSQL의 최대 열 수는 1600 개로 제한됩니다. 더 확장하려면 값을 여러 테이블로 세로로 나눌 수 있습니다. 결과 집합도 1600보다 훨씬 클 수 없으므로 쿼리에 몇 가지 문제가 있습니다.

또 다른 옵션은 키 값 쌍을 배열로 인코딩하는 것입니다. 이 경우의 테이블 구조는 (id serial, ts timestamptz, keys int2 [], values ​​int8 [])입니다. 1,000 동일한 속성의 저장 오버 헤드는 1 %의 채움 인자가 될 것이다 :

23 bytes row header + 1 byte alignment + 4 bytes id + 8 bytes timestamp 
    + 20 bytes array header + 10*2 byte values + 20 bytes array header 
    + 10*8 byte values = 176 bytes per entry 

그러나 특이 값을 조회하면이 경우 좀더 인프라를 필요로한다.

더 나은 저장 효율성 또는 유연성이 필요하면 사용자 지정 데이터 형식을 추가 할 수 있습니다.

많은 PostgreSQL 설치에서 센서 데이터의 큰 열 패턴이 성공적으로 사용되었습니다. 데이터베이스 선택에 관해서는 약간 편견이있을 수 있지만 PostgreSQL을 제안합니다. 배열, 술어 인덱스 및 사용자 정의 데이터 유형과 같은 도구를 사용하면 데이터 저장 영역을 재정비하여 효율성을 높일 수 있기 때문입니다. 명심해야 할 가장 중요한 점은 가야에서 파티션을 사용하는 것입니다.

+1

"수천"의 열이 지원되는 행 크기에 대한 PostgreSQL의 한계에 다가 가고 있습니다. http://www.postgresql.org/about/을 참조하십시오. 열 추가를 계속 사용하는 것에 의존하지 마십시오. 배열을 사용하는 것이 좋습니다. –

+0

Postgresqlm 매뉴얼에서 "열 유형에 따라 표 250 - 1600 당 최대 열"- 감사합니다. – Zepplock

+0

아주 좋은 스케일링은 아닙니다. 엄격한 제한은 정확히 1600으로 설정되어 있으며 PostgreSQL에서 사용하는 페이지 레이아웃을 변경하지 않고는 늘릴 수 없습니다. 배열 기반의 희소 인코딩을 사용하여 답을 수정하겠습니다. –

0

유일한 NewRelic 서비스와 매우 유사하다 동일한 수천 개의 데이터 유형 열이있는 테이블을 설계해야하는 경우 데이터베이스에 이러한 열에 대해 외래 키 제약이 필요한 다른 테이블이 있습니다. 수천 개의 열을 가지고있는 것 외에는 관리하기가 쉽지 않습니다.

jdbm2과 같은 영구 맵 스토리지 엔진을 사용할 수도 있습니다. 그것은 당신과 비슷한 유즈 케이스를 위해 설계되었습니다.

+0

제목에 대한 당신의 의견을 보내 주셔서 감사합니다. 그러나이 질문에 답하는 것이 보이지 않습니다. 또한 JDBM2는이 법안에 맞지 않는 것처럼 보입니다. 동시성, 인덱스, 복제 등이 없습니다. – Zepplock

+0

그는 "이해가 되나요?" 그리고 내 대답은 '아니오'입니다. –

관련 문제