초고속 데이터베이스에서 10 억 행 스캔


9

배경

로컬 데이터베이스에는 거의 13 억 개의 고유 한 행이 있습니다. 각 행은 특정 위도 및 경도 (위치)와 간접적으로 연결됩니다. 각 행에는 날짜 스탬프가 있습니다.

사용 사례

문제는 다음과 같습니다.

  1. 사용자는 시작 / 종료 날짜 및 값 범위 (예 : 100-105)를 설정합니다.
  2. 시스템은 주어진 날짜와 일치하는 모든 행을 위치별로 그룹화합니다.
  3. 시스템은 해당 날짜 동안 지정된 값 범위에 속할 통계적 가능성이있는 위치를 결정합니다.
  4. 시스템은 모든 일치하는 위치를 사용자에게 표시합니다.

이것은 속도와 규모의 문제입니다.

질문

그러한 시스템이 5 초 안에 사용자에 대한 결과를 검색 할 수있는 가장 저렴한 솔루션 아키텍처는 무엇입니까?

현재 시스템

현재 환경은 다음과 같습니다.

  • PostgreSQL 8.4 (업그레이드 가능, 데이터베이스 전환은 옵션이 아님)
  • R과 PL / R
  • XFS
  • WD 벨로시 랩터
  • 8GB RAM (Corsair G.Skill; 1.3GHz)
  • 쿼드 코어 GenuineIntel 7 (2.8GHz)
  • 우분투 10.10

하드웨어 업그레이드가 가능합니다.

업데이트-데이터베이스 구조

수십억 개의 행이 다음과 같은 테이블에 있습니다.

id | taken | location_id | category | value1 | value2 | value3
  • id-기본 키
  • taken-행에 지정된 날짜
  • location_id-위도 / 경도에 대한 참조
  • category-데이터 설명
  • value1 .. 3-사용자가 쿼리 할 수있는 다른 값

taken열은 일반적으로 일별 연속 날짜 location_id이며, 때로는 각 위치에 1800에서 2010까지의 데이터가 있습니다 (약 77,000 개의 날짜가 있으며 각 위치에 동일한 날짜 범위의 데이터가 있으므로 이들 중 다수가 복제 됨).

7 개의 범주가 있으며 테이블은 이미 범주별로 분할되어 있습니다 (자식 테이블 사용). 각 범주에는 ~ 1 억 9 천만 개의 행이 있습니다. 가까운 시일 내에 범주 당 행 수가 10 억을 초과 할 것입니다.

대략 20,000 개의 위치와 70,000 개의 도시가 있습니다. 위치는 위도와 경도로 도시와 상관됩니다. 각 도시를 특정 도시에 할당한다는 것은 도시의 경계를 찾는 것을 의미합니다. 이는 사소한 작업이 아닙니다.

아이디어

내가 가진 몇 가지 아이디어는 다음과 같습니다.

  • 데이터베이스를 호스팅 할 클라우드 서비스를 찾으십시오.
  • 만들기 SSD를 RAID 스트라이프 (큰 비디오).
  • 도시별로 모든 위치를 통합하는 테이블을 만듭니다 (사전 계산).

감사합니다!


10
"데이터베이스 전환은 옵션이 아닙니다"는 대부분의 솔루션을 거의 제거합니다. 행운을 빕니다!
Steven A. Lowe

1
해당 기록으로 정확히 무엇을하고 있는지에 대한 추가 정보 없이는 말하기가 어렵습니다. 또한 5 초 최악의 사례를 찾고 있습니까 (아마도 모든 기록과 0 위치가 일치 함을 의미 함)?
Guy Sirton

2
@Dave : 현재 시스템에 시간이 얼마나 걸립니까? 현재 시스템이 PostGIS를 사용하고 있습니까? 가 하거나 , 또는 두 번째 테이블을 참조? 는 IS 열 인덱스? location_idgeographygeometrylocation_id
rwong

1
@ Thorbjørn & @Darknight-아이디어 섹션에는 사전 계산이 나열되어 있는데, 이는 데이터를 하루에 도시 당 하나의 값 (카테고리 당)으로 줄입니다. 계산은 매년 또는 매월 반복 될 수 있다고 생각합니다. 다른 가능성이 없다면 이것은 나의 계획이었습니다 (계산에는 아마도 몇 주가 걸릴 것입니다).
Dave Jarvis

1
@Dave, 많은 가능성, 그러나 문제는 당신과 관련이 있습니다. 현재 병목 현상이 발생한 위치를 조사 했습니까?

답변:


12

가장 중요한 것은 데이터베이스를 전환 할 수 없으므로 지정된 수의 대표 요청에 대해 병목 현상이 발생하는 위치를 절대적으로 확인하는 것입니다.

전체 테이블 스캔을 수행하는 경우 적절한 색인이 필요합니다.

I / O를 기다리는 경우 캐싱을위한 추가 메모리가 필요합니다 (Jeff Atwood는 최근 데스크톱 시스템에서 24Gb 시스템에 도달 할 수 있다고 언급했습니다).

CPU를 기다리는 경우 계산을 최적화 할 수 있는지 확인해야합니다.

여기에는 뾰족한 DBA 모자와 운영 체제 모자가 필요하지만 올바른 트리를 짖는 데 가치가 있습니다.


각 행이 100 바이트 만 사용하더라도 1.3 억 행 = 121GB 인 경우에도 슬라이스 및 주사위 수 모든 색인 등으로 이것이 훨씬 더 클 것이라고 확신합니다. 단일 상자에서 SSD + RAM 톤 주변에 심각한 하드웨어가 없으면 속도가 느려집니다. 더 저렴한 방법은 여러 상자에 걸쳐 확장하는 것입니다.
Subu Sankara Subramanian

4
@Subu, 당신은 배포 가고 싶어? 이제 두 가지 문제가 있습니다.

허-나는 동의한다 :) 그러나 그것은 더 싸다!
Subu Sankara Subramanian

@ Thorbjørn : 시간과 모든 도움에 감사드립니다. 범주별로 데이터 세트를 2,500 만 행으로 줄인 다음 날짜에 인덱스를 적용 할 것입니다. 스캔을 ~ 70000 행 (1 일, 범위는 2 주로 제한)으로 줄여야합니다.
Dave Jarvis

@Dave, 병목 현상이 어디에 있는지 알아야합니다. 당신이없는 동안 알아보기 에.

4

날짜 스탬프를 기준으로 다른 호스트에있는 여러 조각으로 테이블을 분할하는 것은 어떻습니까? 이것은 수평 확장이 가능하며 충분한 수의 상자가 있으면 이러한 설정 위에 작은 집계 엔진을 작성할 수 있습니다.

날짜 스탬프가 너무 많이 변하는 경우 위치를 기준으로 분할 할 수 있으며 다시 수평으로 확장 가능합니다. (다행스럽게도 위도 / 경도를 더 추가하지 않습니다!)


아이디어 주셔서 감사합니다. 잠재적으로 77,066 개의 날짜가 있으며 앞으로 새로운 날짜가 추가 될 것입니다. 하나의 머신이 있습니다. 20,000 개의 위치가 있지만 분석 할 데이터가 모든 위치에 걸쳐 있기 때문에 위치별로 분할해도 도움이되지 않습니다.
Dave Jarvis

그리고 클라우드를 사용하는 것이 위의 솔루션과 어떻게 다른가요?
Chani

이것은 내가 생각한 것입니다. 모든 종류의 파티션에서 동시에 검색 할 수있는 일종의 수평 파티션.
davidk01

하루에 분할하는 것이 가장 도움이되므로 2562 개의 별도 테이블 (366 일 x 7 개 범주)이 생성됩니다.
Dave Jarvis

4

최악의 시나리오는 날짜 범위가 데이터베이스의 모든 날짜를 포함한다는 것입니다.

하나의 물리적 시스템에서 5 초 이내에 13 억 개의 레코드를 읽고 각 레코드와 입력 된 값에 대해 일종의 분석을 수행하려고합니다. 결과는 모든 위치에 있거나 전혀 없을 수 있습니다. 사전에 아무것도 모릅니다.

이러한 매개 변수가 주어지면 불가능하다고 말할 것입니다.

하드 드라이브를 살펴보십시오. 최대 지속 속도는 150MB / s 미만입니다. 13 억 개의 레코드를 읽는 데 5 초 이상이 걸립니다. CPU 측면에서는 5 초 동안 13 억 개의 레코드에 대해 어떠한 종류의 통계 분석도 수행 할 수 없습니다.

유일한 희망 (tm :-))은 사용자가 입력 한 값을 기반으로 검색을 좁힐 수있는 몇 가지 검색 기능을 찾는 것입니다. 이 조회 기능을 오프라인으로 계산할 수 있습니다. 정확한 일치 기준에 대해 더 많이 알지 못하면 누구나 그렇게하는 방법을 말할 수 있다고 생각하지 않지만 예제는 값 범위를 이산 간격으로 분할하고 해당 간격의 모든 레코드를 제공하는 조회를 만드는 것입니다. 간격이 충분히 작 으면 사용자가 입력 한 값과 일치하지 않는 항목을 제거하는 등 실제 작업을 수행 할 수 있습니다. 기본적으로 시간 거래 공간.

메모리의 모든 레코드 (또는 적어도 중요한 부분)를 보유 할 수 있습니다. 아마 8GB가 아닙니다. 메모리 대역폭조차도 5 초 안에 모든 것을 검색하기에는 충분하지 않지만 디스크 I / O 부분을 제거 할 수 있습니다. 어쨌든 이것은 이러한 종류의 응용 프로그램 속도를 높이는 또 다른 기술입니다 (이전 제안과 결합).

클라우드 서비스 사용을 언급했습니다. 예, 충분한 CPU 및 IO 비용을 지불하고 많은 서버에서 데이터베이스를 분할하는 경우 강제 / 분열하여 정복 할 수 있습니다.


응답 해주셔서 감사합니다. 내가 제시 한 아이디어에 따라 하드웨어 업그레이드를 고려해야합니다. 750 달러 이하의 솔루션이 이상적입니다.
Dave Jarvis

2

두 번째 질문에 대한 rwong의 의견 : PostgreSQL은 적절한 색인 유형 및 도구 (GIST 색인, GIN 색인, Postgis, 기하학 유형)를 제공하여 지리 데이터 및 날짜 시간 관련 데이터를 많은 문제없이 해당 기준에 따라 검색 할 수 있도록합니다.

이러한 기준에 대한 쿼리에 몇 초가 걸리면 해당 인덱스가 사용되지 않는 것입니다. 적절하게 조사했음을 확인할 수 있습니까?


감사합니다. 7 개의 자식 테이블은 btree를 사용하여 위치, 날짜 및 범주에 클러스터됩니다. 작년에 GIN 지수를 조사한 결과 도움이되지 않았습니다.
Dave Jarvis

2
B-Tree를 기반으로 한 색인 생성 위치는 검색 유형을 고려할 때 가장 유용하지 않습니다. 필요한 연산자와 작동하는 거꾸로 된 색인이 필요합니다. Postgis의 경우 일반적으로 GIST를 의미합니다. 몇 가지 느린 질문을 강조하고 싶을 수도 있습니다.
Denis de Bernardy

1

PostgreSQL 및 위도 / 경도 데이터를 사용하는 경우 PostGIS도 사용해야합니다. 이렇게하면 데이터베이스에 GiST 공간 인덱스를 추가하여 작업 속도를 높일 수 있습니다.

나는 당신보다 훨씬 작은 구성 (2 코어 및 거의 2Gb RAM)을 가진 그러한 테이블 (350k 행)을 가지고 있지만 검색에는 1 초도 걸리지 않습니다.


0

Essbase가 OLAP 아키텍처를 사용한 것처럼 관계형 모델을 깨뜨릴 수도 있습니다. Essbase Wikipedia

의미하는 것은 도시 당 하나의 테이블을 생성하여 1000 개 이상의 테이블로 끝나는 것입니다. 당신과 같은 하나의 테이블이 아니라 많은 테이블이 제안되었습니다. 날짜와 위치별로 각 테이블을 색인화하십시오. 많은 테이블, 많은 인덱스-> 더 빠름.


메모 주셔서 감사합니다. 70,000 개가 넘는 도시가 있으며 특정 도시 지역 내에 다양한 위도 / 경도 값이 있습니다.
Dave Jarvis

@Dave : 도시에 대한 보로 노이 다이어그램을 작성하고 위도 / 경도 값을 공간 분할로 분류 할 수 있습니까? (예를 들어, 우연히 들린다면 그대로 두십시오.) 그런 다음 조회하는 동안 테셀레이션이 쿼리의 위도 / 경도 범위에 닿는 모든 도시를 검색합니다. 보로 노이 테셀레이션이 너무 느리면 사각형 상자 (예 : 5도 x 5도)를 시도해 볼 가치가 있습니다.
rwong

0

데이터베이스를 호스팅 할 클라우드 서비스를 찾는 것에 대한 아이디어는 아직 SimpleGeo를 경험 한 적이 있습니까? 그들은 "실제로 데이터를 저장하고 쿼리하는 속도가 엄청나게 빠르다"는 스토리지 서비스에서 리본을 잘라 냈다. 수십억 개 이상의 행에 대해 저장하고 쿼리하는 비용으로 인해이 방법을 실현할 수는 없을 것이다.


-2

고속도로에서 자전거를 타기를 기대하고 있습니다. 현재이 문제를 해결하기위한 해결책을 찾고 있는데, 20 억 개의 레코드가 있다면 어떻게해야합니까? 확장 성을 다루어야합니다. 대답은 간단한 사용 개체 데이터베이스입니다. 예 : 인터 시스템 캐시

내가 당신을 믿습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.