수백만 개의 레코드가있는 부모 테이블과 부모 테이블의 기본 키를 가리키는 외래 키가있는 자식 테이블 세 개가 있습니다. 그래서 같이 :SQL Server의 여러 테이블에서 많은 레코드를 삭제하는 모범 사례
Parent
parent_id (PK) \ Child1
| child1_id (PK)
|---- parent_id (FK)
|
| Child2
| child2_id (PK)
|---- parent_id (FK)
|
| Child3
| child3_id (PK)
|---- parent_id (FK)
은 무엇 하드에 가장 좋은 방법은 Parent
에서 수백 수천 개의 레코드의 삭제 있을까? 다음 조건에서 삭제하고 싶습니다 : DELETE FROM PARENT WHERE [STATUS] = 'DONE'
. 삭제가 진행되는 동안 테이블을 잠그지 않는 방법이 있습니까? 그래서 다른 레코드를 모든 테이블에 삽입 할 수 있습니까? 내가 생각할 수있는 옵션 : 외부 키에
- 사용
CASCADE DELETE
. - 소프트 삭제 사용 : 트랜잭션
UPDATE parent SET [DELETED] = 1 WHERE [STATUS] = 'DONE'
을 시작하고 해당 상위 ID로 각 하위를 삭제 한 다음 상위를 하드 삭제하고 커밋하십시오. - 2.와 비슷하지만 프로 시저를 사용하여 삭제할 ID를 테이블 변수에 저장하므로
Parent
테이블에 새로운[DELETED]
열을 추가 할 필요가 없습니다. - 삭제할 ID를 선택하십시오.
SELECT parent_id FROM parent WHERE [STATUS] = 'DONE'
그런 다음이 모든 ID를 전달하는 일괄 삭제를 수행하십시오. (이것은 정말로 나쁘게 수행합니다, 그래서 나는 그것을 버리고 있습니다).
SQL Server 2014 및 spring jdbc를 사용하고 있습니다.
외래 키에 대해 계단식 삭제를 사용하고 매회 최대 50,000 개의 레코드를 삭제하는 것이 좋습니다. 대다수의 레코드를 삭제하면 대개 작은 배치로 분할 할 때 속도가 빨라집니다. –
저는 작업 진행 상황을 측정하는 팬이기 때문에 작은 부분으로 레코드를 제거하는 절차를 작성하는 것이 좋습니다. ON CASCADE DELETE로 가거나 직접하십시오. –