Мені потрібно оновити 100 мільйонів записів в одній таблиці, фактично нормалізуючи таблицю, замінивши значення varchar стовпця просто ідентифікатором. (Я кажу "заміна", але насправді я записую ідентифікатор в іншу колонку.)
Я намагаюся досягти - це нормалізувати набір даних. Ще не нормалізовані дані не мають індексації. Моя думка полягала в тому, що я не буду будувати індекси на необроблених значеннях, чекаючи, а замість цього індексуватимуть зовнішні ключі, які замінять значення 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)
Фон
- за допомогою MSSQL 2008 R2 на сервері Server 2008 R2
- сервер має 8 ГБ оперативної пам’яті
- сервер має один RAID10, 7200 RPM SATA (не чудово, я знаю, у виробництві це буде лише читання даних, а не запис даних; плюс недавній дефіцит HD зробив це необхідним для витрат)
- сервер має подвійний чотирьохядерний процесор Xeon
- машина не робить нічого іншого (наразі присвячена розробнику, лише цей процес)
- простий журнал увімкнено (? - але чи все ще входить так, щоб він міг відкати?)
- зауважте, що запит посилається на два різні БД, для чого це варто
- "ширина" запису в таблиці, що оновлюється, становить 455 байт
Ресурси під час виконання
- фізична оперативна пам’ять максується
- диск вводу / виводу виводиться на максимум
- Процесор майже нічого не робить (точка задушення - це введення / виведення)
- тривалість роботи тривала 14 годин і підрахунок!
Я підозрюю, що мені потрібен індекс для необроблених даних, хоча я опускаю стовпець (AutoClassName) після оновлення нормалізації. Мені також цікаво, чи варто мені просто циклічно записувати таблицю за один раз замість ПРИЄДНАЙТЕСЯ, що здавалося смішним у той час, коли я починав це, але зараз, здається, це було б швидше.
Як я повинен швидше змінити свою методологію для своїх останніх оновлень щодо нормалізації (подібних до цієї)?
TOP
пункту. Це був би мій підхід.