2011-03-29 2 views
0

다음과 같이 실제 업데이트는 다음과 같습니다T-SQL은 - 큰 테이블 조인에 업데이 트를 수행하는 저장 프로 시저를 최적화

UPDATE TableA 
    SET TableA.Col1 =TableB.Col2 
    FROM TableA (nolock) 
     INNER JOIN TableB (nolock) 
      ON TableA.Col1 = -TableB.Col2 
이 TableB의 COL1 하지에서 발견되는 경우

TableA의 COL1이 반전되고 TableA의 모든 행이 Col1을 업데이트하고 있습니다. 2030 %로 가정합니다.

TableA 크기는 1 백만 행이고, TableB 크기는 800 만 행입니다. Col1 및 Col2 열 모두 색인이 생성됩니다. DB는 상황을 돕지 않는 SQL Server 2000입니다.

감사합니다,

MAA

답변

1

나는 당신이 tableA.Col1에 인덱스를 삭제하는 경우, 업데이트를 실행 한 다음 COL1에 인덱스를 다시 빠르게 많이 줘야 생각합니다.

모든 단일 쓰기의 색인을 업데이트합니다. 삭제 및 재 작성은 대량 작업이 훨씬 빨라야하므로 그렇게합니다.

또한 Col1이 클러스터 된 인덱스에 없는지 확인하십시오. 만약 당신이 그것을 바꿀 수도 있습니다.

+0

는 잘 작동 할 수 절차 일부로보고 있기 때문에 테이블의 크기, 감사, – user1154422

0

이것은 당신이 기록의 일괄 루프하지만 과정을 한 번에 하나도 원하는 한 경우입니다 GJ. 어떤 bacth 크기가 시스템에서 가장 잘 작동하는지 알아야하지만 5000으로 시작해야합니다. 빠르면 더 높은 숫자로 이동하십시오.

DECLARE @Min_id INT, @Max_id INT 

    SELECT @Min_id= MIN(ID) 
    FROM TableA 


    SET @Max_id [email protected]_id + 5000 

    WHILE @Min_id IS NOT NULL 
     BEGIN 

      UPDATE TableA 
      SET TableA.Col1 =TableB.Col2 
      FROM TableA (nolock) 
      INNER JOIN TableB (nolock) 
       ON TableA.Col1 = -TableB.Col2 

      SELECT @Min_id= MIN(ID) 
      FROM TableA 
      WHERE ID > @Max_id 

      SET @Max_id = @Min_id + 5000 
     END 
+0

을 다할 것입니다. 감사, – user1154422

관련 문제