실제로 단일 테이블에서 1 억 개의 레코드를 업데이트하여 열의 varchar 값을 단순히 ID로 바꾸어 테이블을 정규화해야합니다. ( "대체"라고 말하지만 실제로 다른 열에 ID를 쓰고 있습니다.)
내가 달성하려는 것은 데이터 세트를 정규화하는 것입니다. 아직 정규화되지 않은 데이터에는 색인이 없습니다. 내 생각은 원시 값에 대한 인덱스를 작성하지 않고 업데이트가 완료된 후 varchar 값을 tinyint 값으로 대체 할 외래 키를 인덱싱하기를 기다리는 것입니다.
UPDATE A
SET A.AutoClassID = B.AutoClassID
FROM AutoDataImportStaging.dbo.Automobile as A
JOIN AutoData.dbo.AutoClass as B on (A.AutoClassName = B.AutoClassName)
배경
- Server 2008 R2에서 MSSQL 2008 R2 사용
- 서버에 8GB RAM이 있습니다
- 서버에는 하나의 RAID10, 7200 RPM SATA가 있습니다 (제작에는 데이터를 읽고 쓸 수는 없으며 최근의 HD 부족으로 인해 비용이 필요했습니다)
- 서버에는 듀얼 쿼드 코어 Xeon CPU가 있습니다
- 기계가 다른 작업을 수행하지 않습니다 (현재는 dev 전용 이며이 프로세스 만 해당)
- 단순 로깅이 설정되어 있습니까 (?-그러나 롤백 할 수 있도록 여전히 로깅합니까?)
- 이 쿼리는 가치있는 것에 대해 두 개의 다른 DB를 참조합니다.
- 업데이트되는 테이블의 레코드 "폭"은 455 바이트입니다.
실행 중 리소스
- 물리적 RAM이 초과되었습니다
- 디스크 I / O가 초과되었습니다
- CPU가 거의 아무것도하지 않습니다 (초크 포인트는 I / O 임)
- 실행 시간은 14 시간이고 계산되었습니다!
정규화 업데이트 후 열 (AutoClassName)을 삭제하더라도 원시 데이터에 대한 인덱스가 필요한 것 같습니다. 또한 JOIN 대신 한 번에 한 레코드 씩 테이블을 반복 해야하는지 궁금합니다. 이는 시작했을 때 어리석은 것처럼 보였지만 이제는 더 빨랐습니다.
남은 정규화 업데이트 (이와 유사한)에 대한 방법을 더 빨리 변경하려면 어떻게해야합니까?
TOP
조항을 사용한 배치 업데이트에 동의합니다 . 그게 내 접근 방식입니다.