2010-12-20 1 views
2

실시간 AJAX 웹 응용 프로그램의 기능 및 성능을 위해 DB를 설계하고 있으며 현재 DB 서버 중복 또는로드 균형 조정을 추가 할 수있는 리소스가 없습니다.SQL 2008 R2 독립 실행 형 서버가 단일 테이블에 저장해야하는 최대 권장 행 수는 얼마입니까?

불행히도 필자는 DB에 수억 개의 행을 저장할 수있는 테이블을 가지고 있으며 웹 인터페이스가 지연되지 않도록 빨리 읽고 쓸 필요가 있습니다.

대부분이 테이블의 열을 개별적으로 색인화 했으므로 대형 테이블에서 쿼리를 실행할 때 서버 부담을 덜어 줄 수있는 다른 방법이 있는지 알고 싶습니다. 그러나 단일 클러스터되지 않은 SQL 서버가 초크를 만들기 전에 테이블의 크기 (행 또는 GB)에 대한 마침표가 있습니까?

내 DB에는 수십 개의 테이블이 있으며 수십 개의 중요한 키 관계가 있습니다. 내 테이블에는 8 개 이상의 열이 없으며이 테이블 중 하나 또는 두 개만 많은 행을 저장하게됩니다. 다행히도 DB의 단순성이이 두 테이블의 방대한 양의 데이터를 보충 할 것입니다 ...

+2

모두 액세스 패턴에 따라 다릅니다. 예를 들어 테이블 스캔을 수행하는 경우 인덱스 조회 만 수행하는 것보다 훨씬 중요합니다. – Gabe

+0

@Gabe : 대부분 색인 검색을 할 것이므로 좋은 소식 이군요 ... – Giffyguy

답변

4

행은 사용 가능한 디스크 공간의 양에 따라 제한됩니다. 우리는 SQL 서버에 수억 개의 데이터 행을 가지고 있습니다. 물론, 그 서버는 꽤 큽니다.

웹 인터페이스가 원활하게 작동하려면 해당 데이터에 액세스하는 방법을 고려해야합니다.

한 가지 예는 대량의 데이터를 처리해야하는 모든 유형의 집계 쿼리를 멀리하는 것입니다. SUM()과 같은 것은 처리하려는 데이터의 양에 따라 킬러가 될 수 있습니다. 이러한 상황에서는 미리 요약 또는 그룹화 된 데이터를 계산하여 사이트에서 이러한 분석 테이블을 쿼리하는 것이 훨씬 좋습니다.

다음으로 데이터를 분할해야합니다. 서로 다른 드라이브 배열에서 파티션을 분할하십시오. SQL을 디스크로 이동해야 할 때 읽기 작업을 더 쉽게 병렬 처리 할 수 ​​있습니다. (@Simon은 이것에 만졌다.)

기본적으로 문제는 한 번에 얼마나 많은 데이터에 액세스해야하는지에 달려 있습니다. 이것은 디스크에있는 데이터의 양에 관계없이 주된 문제입니다. 드라이브가 느리고 DB 서버에서 사용 가능한 RAM의 양이 충분하지 않아 DB를 메모리에 충분히 보관할 수없는 경우 작은 데이터베이스라도 막을 수 있습니다.

일반적으로 이와 같은 시스템의 경우 대용량 데이터는 기본적으로 비활성이므로 액세스가 거의 없습니다. 예를 들어, PO 시스템은 이전에 생성 된 모든 송장의 내역을 유지할 수 있지만 실제로는 모든 활성 송장 만 처리합니다.

시스템에 유사한 요구 사항이있는 경우 활성 레코드 용 테이블을 야간 프로세스의 일부로 다른 테이블에 보관하면됩니다. 아카이브의 일부로 월평균과 같은 통계 (예를 들어)를 다시 계산할 수도 있습니다.

몇 가지 생각.

+0

제 서버에는 8GB 램이 있지만 기본 캐시에 충분합니다. 필요한 경우 도로를 따라 쉽게 업그레이드 할 수 있습니다. 불행히도 대부분의 데이터는 지속적이고 일관되게 액세스 할 수 있어야하지만 아카이브 테이블은 여전히 ​​선택 사항입니다. 결국 아카이브 테이블을 만들고 역사적 데이터가 필요할 때마다 두 번의 쿼리 결과를 결합해야 할 것입니다. 파티션의 경우 하나의 디스크 어레이 만 있습니다. - 1TB 패리티로 스트라이프 된 5TB 드라이브 5 개. 배열이 여러 개 없을 때 분할이 여전히 유용합니까? – Giffyguy

+1

@Giffyguy : 여러 물리적 드라이브에 퍼뜨릴 수없는 경우 파티션 할 이유가 없습니다. 결국 모든 읽기 헤드는 한 번에 두 곳에있을 수 없습니다. 스크래치, 배열에서 그들이 될 수 ... 흠. 동일한 어레이에서 SQL을 파티셔닝하는 것에 대한 serverfault의 후속 조치를 요청할 수 있습니다. – NotMe

1

내 직감은 당신이 아마 괜찮을 거라고 말하지만, 성능을 다뤄야 할 것입니다. 이는 쿼리에서 검색 가능한 결과 시간에 따라 달라질 것입니다.

"수억 개의 행"이있는 테이블의 경우 정기적으로 액세스하는 데이터의 비율은 어느 정도입니까? 거의 액세스하지 않은 데이터가 있습니까? 일부 사용자는 선택한 데이터에 액세스하고 다른 사용자는 다른 데이터를 선택합니까? 데이터 파티셔닝의 이점을 누릴 수 있습니다.

4

기본 키의 크기 만 제한됩니다. 그것은 INT 또는 BIGINT입니까?

SQL은 문제없이 데이터를 행복하게 저장합니다. 그러나 100 만 개의 행을 사용하면 데이터를 가장 효율적으로 분할 할 수 있습니다. 이것에 관해서는 article과 같은 많은 좋은 기사가 있습니다.

파티션을 사용하면 파티셔닝하지 않고도 쿼리를 병렬 처리 할 수 ​​있도록 파티션 당 스레드를 한 개씩 동시에 가질 수 있습니다.

+1

'INT'는 40 억 개의 행을 제공합니다 - BIGINT는 대다수에게 충분합니다. 의 경우, 나는 생각할 것 ... –

+0

파티션은 일반적인 권장 사항 인 것처럼 보입니다. althouth 저는 1TB 패리티로 스트라이프 된 5TB 드라이브 5 개와 함께 작동 할 하나의 디스크 어레이 만 가지고 있습니다. @mark_s : 실제로'INT'는 서명했기 때문에 약 20 억을줍니다.하지만 BITINT를 사용하고 있습니다. 확장 성을 차단하는 의미는 없습니다 ... – Giffyguy

관련 문제