Tôi cần cập nhật 100 triệu bản ghi trong một bảng, thực tế, bình thường hóa bảng bằng cách thay thế giá trị varchar của một cột chỉ bằng một ID. (Tôi nói "thay thế" nhưng thực sự tôi đang viết ID vào một cột khác.)
Những gì tôi đang cố gắng đạt được là bình thường hóa tập dữ liệu. Dữ liệu chưa được chuẩn hóa không có chỉ mục. Suy nghĩ của tôi là tôi sẽ không xây dựng các chỉ mục trên các giá trị thô, chờ đợi, thay vào đó để lập chỉ mục các khóa ngoại sẽ thay thế các giá trị varchar bằng các giá trị nhỏ sau khi cập nhật hoàn tất.
UPDATE A
SET A.AutoClassID = B.AutoClassID
FROM AutoDataImportStaging.dbo.Automobile as A
JOIN AutoData.dbo.AutoClass as B on (A.AutoClassName = B.AutoClassName)
Lý lịch
- sử dụng MSSQL 2008 R2 trên Server 2008 R2
- máy chủ có RAM 8 GB
- máy chủ có một RAID10, 7200 RPM SATA (không tuyệt vời, tôi biết, trong sản xuất, nó sẽ chỉ đọc dữ liệu và không ghi dữ liệu; cộng với sự thiếu hụt HD gần đây khiến điều này trở nên cần thiết cho chi phí)
- máy chủ có CPU Xeon lõi tứ kép
- Máy không làm gì khác (hiện chỉ dành riêng cho dev, chỉ có quá trình này)
- đăng nhập đơn giản được bật (? - nhưng nó vẫn đăng nhập để có thể quay lại?)
- lưu ý rằng truy vấn tham chiếu hai DB khác nhau, với giá trị nào
- "chiều rộng" của một bản ghi trong bảng được cập nhật là 455 byte
Tài nguyên trong quá trình thực thi
- RAM vật lý được tối đa hóa
- đĩa I / O được tối đa hóa
- CPU hầu như không làm gì cả (điểm sặc là I / O)
- thời gian chạy đã được 14 giờ và đếm!
Tôi nghi ngờ một số điều như tôi cần một chỉ mục trên dữ liệu thô, mặc dù tôi sẽ bỏ cột (AutoClassName) sau khi cập nhật chuẩn hóa. Tôi cũng tự hỏi liệu tôi có nên lặp lại bảng một lần thay vì THAM GIA, điều này có vẻ vô lý vào thời điểm tôi bắt đầu việc này, nhưng bây giờ có vẻ như nó sẽ nhanh hơn.
Làm cách nào để thay đổi phương pháp luận của tôi cho các cập nhật chuẩn hóa còn lại của tôi (tương tự như phương pháp này) nhanh hơn?
TOP
mệnh đề. Đó là cách tiếp cận của tôi.