2012-02-16 3 views
1

일부 데이터를 구문 분석하고이를 .NET에서 3 개의 테이블로 삽입합니다. 테이블 삽입 매개 변수를 사용하여 일부 삽입으로 데이터를 전달하는 데 600,000 개의 행이 사용됩니다. 개체 (DataTables 아님)를 전달하면 참조로 전달됩니다 (TVP의 특성). 삽입 값으로 직선 값 삽입에 비해 100 : 1의 이득을 얻을 수 있습니다. 한 번에 1000 개의 행으로 제한됩니다. 저장 프로 시저에서 TVP의 실제 테이블에 대한 삽입은 클러스터 된 인덱스에 따라 정렬됩니다. 이 테이블에는 클러스터 된 인덱스 이외의 인덱스가 없습니다. SP는 TABLOCK을 취합니다.이 테이블은 1 회 기록 테이블과 1 개의 데이터 로더입니다. Fill Factor 100 데이터 또는 트랜잭션 로그 크기가 증가하지 않습니다. 총 데이터로드에 대한 크기입니다. 마지막으로 질문. 지난 4 시간 동안 2 억 개의 행이 삽입되었습니다. 인서트 응답 시간이 1/2로 감소했습니다. 채우기 비율이 100이고 클러스터 된 인덱스로 정렬을 삽입하는 경우 왜 응답이 떨어지나요? 이 문제를 해결하려면 어떻게해야합니까?표 삽입 비율이 느려짐 표 축소 표 확대 크기 증가가

내가 사용하기 전까지 TVP를 얻지 못했습니다. 역 DataReader와 같습니다.

귀하의 도움에 감사 드리며 잘못된 문제 진술에 사과드립니다. 각 구문 분석 (이 경우 200,000을 구문 분석)의 경우 삽입은 클러스터 된 인덱스에 따라 정렬됩니다. 그러나 3 개의 테이블 중 1 개만 클러스터 된 인덱스 순서로 전체적으로 다음 구문 분석을 수행합니다. 70,000 구문 분석 후 좋은 테이블은 99 %의 스캔 밀도를 갖지만 다른 두 테이블은 12 %의 스캔 밀도로 심각하게 단편화됩니다.

두 조각화 된 테이블에 채우기 비율을 50으로 설정하고 다시 색인화하십시오. 지금 나는 최대 속도의 약 1/3을 얻고있다. 몇 시간마다 프로세스를 중단하고 색인을 다시 작성하면됩니다.

결국 내가 클러스터링 된 인덱스를 삽입 순서와 일치하도록 변경했습니다. 이전에 클러스터 된 인덱스를 작성했습니다. 나는 고유 인덱스를 비활성화하고 데이터를 삽입 한 다음 고유 인덱스를 다시 작성합니다. 이 시나리오를 사용하면 10 시간 동안 300 : 1의 성능을 얻을 수 있습니다. 그건 0 - 3 백 1 달러가 아닙니다. 그리고 그것은 주문한 색인과 채우기 인자 또는 30으로 시작할 때와 비교해 보았습니다. 여분의 색인을 사용해도 100이라는 두 가지 채우기 인자를 모두 가질 수 있으므로 테이블 크기가 더 작습니다.

일부 #temp를 사용합니다. 쿼리를 사용하여 쿼리에 대해서만 알려진 순서로 행을 가져올 수 있습니다. #temp를 TVP로 변환하고 1/2 초 (#temp를 만들고 삭제하는 데 걸리는 시간)를 얻었습니다. @SqlACID 언급로 테이블이 채워으로

대답 코멘트를 변환 OP 당
+0

대상 테이블에 제약 조건, 트리거 또는 클러스터되지 않은 인덱스가 없다고 가정합니다. 죄송합니다. TVP로 많은 성능 프로파일 링을 수행하지 않았으므로 다른 무엇이 간섭하는지 잘 모릅니다. 아, 나는 태그를 편집했는데, 이미 존재했다. :-) –

+0

@AaronBertrand 감사합니다. 태그를 찾지 못했습니다. 전체 데이터베이스에서 트리거가 없습니다. 두 가지 제한 조건이 있지만 제한 조건 부가 테이블은 변경되지 않습니다. 내 코드가 손상되지 않은 경우 제약 조건 위반이 없어야합니다. 삽입물에 대한 제약 검사를 비활성화해야한다고 생각하십니까? 제약 조건 검사를 비활성화하고 제약 조건을 위반하면 어떻게됩니까? 이 경우 TVP는 대량 복사와 비슷하지만 메모리 개체로부터옵니다. 일부 사전에서 TVP를 직접 먹이면 구문 분석에서 고유 한 값과 고유 한 값 쌍을 찾습니다. – Paparazzi

+0

세 테이블 중 하나에 클러스터되지 않은 인덱스가 잘못 있습니다. 이 테이블은 세 개의 인덱스 중에서 가장 작은 테이블이며 계수가 100이며 비 클러스터형 인덱스는 단일 열에 있습니다. 테이블의 인덱스는 결합 된 다른 두 인덱스 크기의 약 두 배인 160KB입니다. 그 혼자서 속도 저하를 설명 할 수 있습니까?나는 색인에 필을 넣고 테스트 할 수있을 것 같아요? – Paparazzi

답변

0

...

자동 통계뿐만 아니라, 제약 조건 검사가 더 비싼 얻을 수 있습니다. 테이블을 심각하게로드하려는 경우 일반적으로 인덱스 및 제약 조건을 해제하거나 삭제하고 속도가 궁극적 인 목표 인 경우 나중에 다시 계획합니다. 이는 제약 조건을 위반하는 경우 사실 이후에 행을 삭제하거나 가능할 때 대용량 데이터에 대해 더 나은 유효성 검사를하는 것을 의미 할 수 있습니다.