2014-02-16 4 views
-1

У меня есть большая таблица (около 40M строк), где у меня было несколько столбцов, которые равны 0, которые должны быть нулевыми, чтобы мы могли лучше использовать данные.Перемещение больших объемов данных вместо их обновления

Я написал сценарии, чтобы посмотреть нарезание обновления на куски 10000 записей, найти столбец с нулем и обновить их до нуля.

Пример:

update FooTable 
set order_id = case when order_id = 0 then null else order_id end, 
     person_id = case when person_id = 0 then null else person_id end 
WHERE person_id = 0 
OR  order_id = 0 

Это прекрасно работает, но он принимает навсегда.

Я думаю, что лучший способ сделать это - создать вторую таблицу и вставить в нее данные, а затем переименовать ее, чтобы заменить старую таблицу столбцами, имеющими нуль.

Вопрос: могу ли я сделать вставку в таблицу2, выбрать из таблицы1, и в процессе очистить данные из таблицы1 до ее входа?

+0

Попробуй и посмотри? – Malk

+0

Какие индексы вы создали на 'FooTable'? Вы рассматривали разделение SQL на два SQL (один для 'WHERE person_id = 0', а другой для' WHERE order_id = 0')? Вы посмотрели планы исполнения? –

ответ

0

Обычно вы можете создать новую, дезинфицированную таблицу, в зависимости от используемого сервера БД.

Сложно то, что если в базе данных есть другие таблицы, могут возникнуть проблемы с внешними ключами, индексами и т. Д., Которые будут ссылаться на исходную таблицу.

Будет ли создание новой дезинфицированной таблицы быстрее, чем обновление существующей таблицы - это то, о чем вы можете только сказать, попробовав ее.

+0

На самом деле просто попробовал и работал как шарм! Был способен выполнять массовую вставку в новую таблицу всего за 3 минуты, тогда как обновление занимало 10 часов. Законченное глядя, как это: ВСТАВИТЬ FooTable2 (order_id, person_id) ВЫБРАТЬ случай, когда order_id = 0, то нуль еще Order_ID конец, случай, когда person_id = 0, то нуль еще person_id конец time_stamp ОТ FooTable Теперь, я должен буду вернитесь и отбросьте ключи и индексы из FooTable, Drop FooTable, Rename FooTable2, а затем создайте индексы и т. д., но это лучше, чем ждать. – user3317155

0

Дамп pk/сгруппированный ключ всех записей, которые вы хотите обновить, в таблицу темп. Затем выполните обновление, присоединяющееся к таблице temp. Это обеспечит самый низкий уровень блокировки и быстрый доступ. Вы также можете добавить столбец идентификатора в таблицу temp, чем вы можете прокручивать и делать обновления пакетами.

Смежные вопросы