2011-04-12 4 views
0

내 SQL 서버 2008R2 데이터베이스는 큰 관련 테이블을 많이 가지고 :일괄 삭제 - 계단식 삭제 성능 킬러?

  • 마스터
  • 세부-1
  • 세부-2
  • 세부-2-A

모든 외래 키가 계단식으로 연결됩니다.

  • master -> detail1
  • 마스터 -> detail2
  • detail2-> detail2-A I 마스터에서 레코드를 삭제할 때

그래서, 모든 관련 세부 사항이 따릅니다. 삭제하는 데 시간이 오래 걸립니다. 예 : 한 명의 마스터는 120 만 건의 레코드를 보유 할 수 있으며, 2 천만 건의 레코드를 담을 수 있습니다.

먼저 detail2A, detail2 등을 삭제하는 저장 프로 시저를 만드는 것이 더 효율적입니까? 아니면 더 나은 방법이 있습니까?

DB는 구분되지 않습니다.

답변

1

큰 삭제가 완료되면 잠금 테이블을 제어 할 수 없기 때문에 시스템에서 삭제 계단식을 허용하지 않습니다. 많은 수의 레코드를 자주 삭제해야하는 경우에는 여러 가지 방법이 있습니다. 첫째, 정말로 삭제해야합니까, 아니면 비활성화로해야합니까? 이것은 아마도 가장 효율적인 처리 방법 일 것입니다.

또는 일괄 적으로 처리 할 수 ​​있습니다. 델타하려는 모든 id 값을 스테이징 테이블로 이동 한 다음 한 번에 1000 개 (또는 실제 번호는 성능상의 이유로 시스템에서 결정할 수있는 20000 또는 200 개) 만 삭제하고 모든 레코드가 삭제 될 때까지 반복합니다. . 캐스케이드에서 삭제하는 것보다는 한 번에 한 테이블 씩 삭제하는 것이 좋습니다.

또는 다른 사용자를 차단하지 않도록 데이터베이스의 사용량이 적은 시간대에 삭제 기록을 남기고 실제 삭제를 밤새 할 수 있습니다.

캐스케이드 삭제와 함께 고려해야 할 사항은 하위 레코드가있는 경우 정말로 레코드를 삭제 하시겠습니까? 외래 키 (foreign key)는 부분적으로 당신이 그것을하지 못하도록하고 캐스케이드 삭제 (cascade delete)는 그 동작을 오버라이드 (override)합니다. 따라서 자녀 기록이 주문과 같은 것이라면 어떤 상황에서도 계단식 삭제에서 자동으로 삭제하려는 경우 또는 고객이 더 이상 활동하지 않아도 필요한 재무 정보를 잃어 버리는 경우는 없습니다.

관련 문제