2010-04-07 2 views
1

많은 "클라이언트"에 대한 데이터가 포함 된 데이터베이스가 있습니다. 현재 우리는 .Net SqlBulkCopy을 사용하여 수십만 개의 행을 여러 테이블에 자주 삽입합니다. 이로 인해 트랜잭션 기간 동안 전체 테이블이 잠기고 액세스 할 수 없게됩니다.파티션이 여러 대량로드를 허용합니까?

대부분의 비즈니스 프로세스는 한 번에 한 클라이언트에 대해서만 데이터에 액세스하므로 다른 클라이언트의 데이터를 업데이트하는 동안 한 클라이언트에 대한 데이터를로드 할 수 있기를 원합니다.

모든 재미있는 일을 만들기 위해 모든 PK, FK 및 클러스터 된 인덱스가 GUID 열에 있습니다 (이 변경을 고려하고 있습니다).

모든 테이블에 ClientID를 추가 한 다음이를 파티셔닝하고 있습니다. 필요한 기능을 제공합니까?

+0

나는 대답이 없지만 PK는 GUID가 좋은 선택입니다. 아이디어가 외계인이라고 느끼기 때문에 이것을 바꾸지 마십시오. :-) –

+0

@Aaron -하지만 클러스터 된 인덱스에는 좋지 않습니다. 현재 4 백만 행의 테이블 만이 거의 수행되지 않습니다 ... – cjk

+0

@ck -하지만 PK와 클러스터링은 함께 묶이지 않습니다. –

답변

2

SQL Server의 기본 제공 파티셔닝 기능을 사용하지 않았지만 특히 관심이 있습니다. 제 이해는이 문제가 해결 될 수 있다는 것입니다.

this article

에서 이것은 당신이 다른 사람에 영향을주지 않고, 심지어의 performace 중요한 동작과 같은 인덱싱와 파티션에서 작동 할 수 있습니다.

Kimberly L Tripp의 파티셔닝에 대한 훌륭한 백서는 here입니다. 읽는 것만 큼 가치가 있습니다 - 나는 그것을 바꿔 쓰려고하지 않을 것입니다 - 모든 것을 자세히 다룹니다.

희망이 도움이됩니다.

+0

고마워, 나는 그것들을 조사 할 것이다. – cjk

1

클라이언트 ID를 파티션 할 수 있습니까 : 예, 하드 리미트가되기 전에 1000 클라이언트가되도록 파티션이 1000 개의 파티션으로 제한됩니다. 이를 해결할 수있는 유일한 방법은 여러 개의 분할 된 테이블에서 분할 된 뷰를 사용하는 것입니다.

윌 상황에 도움이됩니다 : SQL 2005에서 잠금 에스컬레이션은 행 -> 페이지 -> 테이블이지만, 2008 년에 그들은 행 -> 페이지 -> 파티션 -> 테이블을 허용하는 새로운 레벨을 도입했습니다. 따라서 SQL 버전 (지정되지 않음)에 따라 다룰 수 있습니다.

2008 옵션을 사용할 수없는 경우 잠금 에스컬레이션을 해제하는 추적 플래그 (TF 1211/1224) 기능이 있지만 심각한 테스트를 거치지 않고서는 사용하지 않을 것입니다.

파티셔닝 기능은 기업의 상향 기능으로 남겨져 일부 사람들을 벗어납니다.

데이터로드를 수행하면서 잠금을 피하는 가장 이상적인 방법은 데이터를 스테이징 테이블로 가져온 다음 데이터를 새 파티션으로 스왑하는 것입니다. 그러나이 경우 데이터는 다소 시퀀스 기반 (예 : datetime) 새로운 데이터를 완전히 새로운 파티션으로 가져올 수 있으며 오래된 데이터는 결국 제거됩니다. (파티션 윈도우 롤링).

관련 문제