2010-07-15 4 views

답변

0

합니까 "테이블"에 비슷한 수행 "ID"열에 인덱스를 가지고 있나요?
그렇지 않으면 SQL Server는 테이블 검색을 수행하여 삭제할 레코드를 찾습니다. "id"열에 색인을 생성하여 속도를 높일 수 있습니다.

"other_table"과 동일 - 해당 테이블의 선택에 WHERE 절도 있으면 해당 테이블에서 사용되는 열의 색인이 생성되는지 확인하십시오.

1

사례에 따라 특별한 도움이 필요하지 않습니다.

일반 규칙 (해당하는 경우) :

  1. 이 table.id
  2. 에 대한 클러스터되지 않은 인덱스를 가지고 있지만 다른 모든 키를 제거/indexies는
  3. 다른 모든 키를 제거 사용한 적이거나 드물게/indexies 전에 삭제 연산을 수행 한 후 나중에 다시 작성하십시오.
  4. table.id에 대한 custered 색인을 사용하지 마십시오.
  5. 색인을 사용하여 "SELECT id FROM other_table"을 가속화하십시오 (이 부속 선택에 임의의 종류의 where 절이 있다고 가정하십시오. n real world)
0

한 번에 1000 개 레코드와 같이 작은 배치로 삭제하십시오. 실제 삭제는 약간의 시간이 걸릴 것입니다 (필요한 인덱스가 제자리에 있는지 확인하십시오). 장기 실행 삭제가 실행되는 동안 사용자가 테이블에서 잠기지 않습니다.

1

따라야 할 몇 가지 일반적인 아이디어.

  • 클러스터 된 인덱스가있는 열에서 삭제하지 않았는지 확인하십시오.
  • 행의 다른 열에 키 또는 색인이 있는지 확인하십시오.
  • 선택한 부분에서 많은 양의 레코드를 선택하지 않았는지 확인하십시오.

그 외에도 천천히 일으키는 원인에 대한 주관적인 추측입니다. 가장 좋은 방법은 사물을 시도하고 도움이되는 것과 느린 것을 만드는 것, 삭제가 호출 될 때 행의 항목을 찾는 방법을 이해하고 거기에서 가장 오래 걸리는 것을 보는 것입니다.

1
  • 일괄는
  • 사용
  • 당신이 두 테이블에서 ID에 대한 올바른 인덱스가 있는지 확인 EXISTS

예 :

SELECT 'Starting' 
WHILE ROWCOUNT <> 0 
    DELETE TOP (1000000) T 
    FROM table T 
    WHERE EXISTS (
     SELECT * from otherTable OT WHERE T.id = OT.id 
    ) 

일부 영감 아마도 : Bulk DELETE on SQL Server 20087 billion row delete

관련 문제