2012-08-13 3 views
3

일정이 잡힌 새 데이터의 불규칙 대량로드를 제공하면서 독자에게 고 가용성을 요구하는 데이터베이스의 데이터 가져 오기 메커니즘을 만들려고합니다.대량 인덱싱 된 하위 항목 대량 삽입 (Sql Server 2008)

새 데이터에는 새 데이터 세트가 추가되고 새로운 데이터 세트 항목이 참조되는 데이터 테이블 항목이 3 개 포함되며이를 참조하는 몇 가지 데이터 세트 항목 메타 데이터 행이 포함됩니다. 데이터 세트에는 수만 개의 데이터 세트 항목이있을 수 있습니다.

데이터 세트 항목은 where 절의 데이터 세트 ID를 포함하여 대부분의 읽기 (전부는 아님)와 여러 열 조합에 대해 크게 색인되어 있습니다. 인덱스 때문에 데이터 삽입은 유입 속도를 따라 잡기에는 너무 느리지 만 인덱스의 독자가 우선 순위를 갖기 때문에 주 테이블의 인덱스를 제거 할 수는 없지만 사본을 작성해야합니다.

따라서 필자는 일종의 작업 테이블을 필요에 따라 복사하고 삽입 한 다음 다시 인덱싱하여 쿼리 된 테이블/뷰의 일부가되도록 전환해야합니다. 문제는 스위치를 신속하게 수행하는 방법입니다.

외래 키인 데이터 집합 ID의 범위로 데이터 집합 항목 테이블을 분할하는 방법을 살펴 봤지만 기본 키의 일부가 아니기 때문에 SQL Server가 그렇게 쉽게 보이지 않습니다. 쉽게 인덱싱 된 업데이트 된 버전으로 이전 데이터 파티션을 전환 할 수 없습니다.

다른 기사에서는 분할, 스냅 샷 격리 및 분할 된보기의 사용을 제안하지만 인덱싱을 고려하지 않고 오래된 데이터를 일괄로드 및 보관 (날짜별로 분할) 또는 간단한 트랜잭션 격리와 관련하여 직접적으로 대답하지 않습니다.

이 겉보기 공통적 인 문제를 직접 해결할 수있는 예가 있습니까?

큰 인덱스 테이블에 새로운 데이터를 대량로드 할 때 인덱스가 비활성화되는 시간을 최소화하기 위해 사람들은 어떤 전략을 갖고 있습니까?

+0

잠시 동안 독자가 ​​'부실'데이터를 얻는 지 여부는 중요하지 않으므로 트랜잭션이 너무 중요하지 않으며 삽입을 확장하고 가능할 수 있도록 작성자를 단일 스레드로 분리 할 수 ​​있다는 점에 유의하십시오. 여러 개의 데이터 세트를 병렬로 업데이트 할 수 있습니다. 한 개의 쓰레드가 하나의 파티션을 담당 할 수 있습니다. –

+0

일부 관련 링크 : http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/e872ba33-cb3e-49f6-ada9-5152735aa0cb http://social.msdn.microsoft.com/Forums/ko/sqldatabaseengine/thread/783c84a3-307a-46a6-8250-42816ede62f5 –

+0

관련 질문 나는 같은 일을 성취하려고하는 것처럼 보이지만 다른 사람들로부터 발견되었습니다.문제는 여러 파티션을 병렬로 추가하고 다시 색인 할 수 있기를 원합니다. 다른 파티션을 다시 인덱싱하는 동안 삽입을 수행하려면 파티션 수준에서 인덱스를 비활성화 할 수 없으므로 각 파티션에 별도의 작업 테이블이 있어야합니다. 즉 동적 SQL로해야한다는 의미입니다. :( http://stackoverflow.com/questions/1367972/drop-index-at-partition-level http://stackoverflow.com/questions/2772738/sql-server-2008-disable-index-on- 특정 테이블 파티션 –

답변

1

주목할 것은 칼럼의 분할은 컬럼이 기본 키의 일부가 아닌 클러스터 된 인덱스 키의 일부가되어야한다는 것입니다. 둘은 독립적입니다.

여전히 파티션은 테이블에서 수행 할 수있는 조작에 대한 많은 제한 조건을 부과합니다. 예를 들어, 모든 인덱스가 정렬되고 외래 키가 수정중인 테이블을 참조하지 않는 경우에만 전환이 작동합니다.

이러한 모든 제한 하에서 파티션을 사용할 수 있다면 가장 좋은 방법 일 것입니다. 분할 된 뷰는 더 많은 유연성을 제공하지만 비슷한 제한이 있습니다. 모든 인덱스가 분명히 정렬되고 들어오는 FK는 불가능합니다.

데이터를 분할하는 것은 쉽지 않습니다. 클릭 투 스루 마법사 및 완료 솔루션은 아닙니다. 단점은 매우 복잡합니다.

+0

좋아, 클러스터 된 인덱스와 기본 키의 차이점에 대해 이해합니다. 분할 된 뷰의 유연성을 설명 할 수 있습니까? 어떤 상황에서 분할 된 테이블보다 분할 된보기가 더 적합합니다. –

+0

다른 필요할 때 스키마 또는 CI의 일부로 파티셔닝 키를 사용하지 않으려는 경우 * 다른 인덱스를 사용할 수도 있습니다. 아카이브 및 스테이지라는 두 개의 기본 테이블이있는 분할 된 뷰를 가질 수 있습니다. 스테이지에 넣고 밤에는 모든 것을 병합하여 스테이지에 자릅니다. – usr