ฉันต้องการอัปเดต 100 ล้านเรคคอร์ดในตารางเดียวโดยมีผลทำให้มาตรฐานของตารางเป็นปกติโดยแทนที่ค่า varchar ของคอลัมน์ด้วย ID เพียงอย่างเดียว (ฉันพูดว่า "การแทนที่" แต่จริงๆแล้วฉันกำลังเขียน ID ลงในคอลัมน์อื่น)
สิ่งที่ฉันพยายามทำให้สำเร็จคือการทำให้ชุดข้อมูลเป็นมาตรฐาน ข้อมูลที่ยังไม่ได้ทำให้เป็นมาตรฐานไม่มีการจัดทำดัชนี ความคิดของฉันคือฉันจะไม่สร้างดัชนีในค่า raw รอแทนดัชนีคีย์ต่างประเทศที่จะแทนที่ค่า varchar ด้วยค่าจิ๋วจินหลังจากการอัพเดตเสร็จสมบูรณ์
UPDATE A
SET A.AutoClassID = B.AutoClassID
FROM AutoDataImportStaging.dbo.Automobile as A
JOIN AutoData.dbo.AutoClass as B on (A.AutoClassName = B.AutoClassName)
พื้นหลัง
- ใช้ MSSQL 2008 R2 บนเซิร์ฟเวอร์ 2008 R2
- เซิร์ฟเวอร์มี RAM 8 GB
- เซิร์ฟเวอร์มีหนึ่ง RAID10, 7200 RPM SATA (ไม่ค่อยดีเท่าไหร่ในการผลิตนี้จะอ่านเฉพาะข้อมูลและไม่เขียนข้อมูลรวมถึงปัญหาการขาดแคลน HD ล่าสุดทำให้จำเป็นต้องเสียค่าใช้จ่าย)
- เซิร์ฟเวอร์มี CPU Xeon แบบ Quad-Core คู่
- เครื่องไม่ได้ทำอะไรอย่างอื่น (ในปัจจุบันอุทิศให้กับ dev เพียงกระบวนการนี้เท่านั้น)
- เปิดใช้งานการบันทึกอย่างง่าย (? - แต่ยังเข้าสู่ระบบอยู่หรือไม่เพื่อให้สามารถย้อนกลับได้)
- โปรดทราบว่าแบบสอบถามอ้างอิงสอง DB ที่แตกต่างกันสำหรับสิ่งที่คุ้มค่า
- "width" ของระเบียนในตารางที่ได้รับการอัพเดตคือ 455 ไบต์
ทรัพยากรระหว่างการดำเนินการ
- RAM ทางกายภาพสูงสุด
- disk I / O maxed out
- CPU แทบจะไม่ทำอะไรเลย (จุดทำให้หายใจไม่ออกเป็น I / O)
- เวลาในการทำงาน 14 ชั่วโมงและเพิ่มขึ้นเรื่อย ๆ !
ฉันสงสัยว่าบางสิ่งเช่นฉันต้องการดัชนีในข้อมูลดิบแม้ว่าฉันจะวางคอลัมน์ (AutoClassName) หลังจากการปรับปรุงมาตรฐาน ฉันยังสงสัยว่าฉันควรวนตารางหนึ่งระเบียนทีละครั้งแทนที่จะเข้าร่วมซึ่งดูเหมือนไร้สาระในเวลาที่ฉันเริ่มต้นนี้ แต่ตอนนี้ดูเหมือนว่าจะเร็วขึ้น
ฉันจะเปลี่ยนวิธีการของฉันสำหรับการปรับปรุงการทำให้เป็นมาตรฐานปกติที่เหลืออยู่ (คล้ายกับวิธีนี้) ได้เร็วขึ้นได้อย่างไร
TOP
ข้อ นั่นเป็นแนวทางของฉัน