Добавление новых столбцов в базу данных столбцов, содержащую миллиарды строк - PullRequest
3 голосов
/ 19 июля 2010

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

Например,

new_col1 = old_col1 + old_col2
new_col2 = old_col1 / old_col2

Я пытаюсь сделать это следующим образом -

Добавить новые столбцы

ALTER TABLE table_name
ADD (   column_1    column-definition,
column_2    column-definition,
... 
column_n    column_definition )

Считывание строк по одной из таблицы и заполнение значений для новых столбцов.

В базе данных нет первичного ключа. Поэтому я не могу сослаться на отдельный ряд. Чтобы читать строки одну за другой, мне нужно сделать выбор *, который дал бы огромный набор результатов (учитывая миллиарды записей).

Есть ли лучший способ сделать это?

Ответы [ 3 ]

2 голосов
/ 19 июля 2010

Разные СУБД имеют разные диалекты SQL, полезно указать, какие вы используете в вопросе.

В SQL Server вы можете использовать Вычисляемый столбец , но это будет вычислять результат каждый раз, когда вы выбираете данные, вы можете пометить его как постоянный, но для внесения изменений может потребоваться некоторое время. Но вы не сможете этого сделать, если собираетесь удалить старые столбцы.

В качестве альтернативы создайте новый столбец, разрешающий пустые значения, а затем обновите его партиями

UPDATE TOP (1000) table_name SET new_col1 = old_col1 + col_col2 WHERE new_col1 IS NULL

Опять же, запрос для SQL Server, но будут альтернативы для вашей СУБД.

Также прочитайте комментарий господина Хуперса о добавлении индекса в новый столбец, чтобы убедиться, что производительность UPDATE не ухудшается при добавлении большего количества данных. Обновление является операцией чтения и записи, индекс ускорит чтение и немного задержит запись (поддержание индекса), но это того стоит.

1 голос
/ 19 июля 2010

Я думаю, что метод мистера Дайвера был бы хорош, если бы вы также добавили индекс в один из ваших новых столбцов; в противном случае, по мере выполнения задания ему придется все больше и больше сканировать, чтобы найти строки, которые он еще не обновил. Добавление индекса будет означать, что это не обязательно делать. Возможный недостаток заключается в том, что дифференцирование индекса будет ужасным при создании столбца, но я не думаю, что это будет проблемой, поскольку вы заботитесь только о NULL или NOT NULL. Вы можете удалить индекс после завершения обновления.

0 голосов
/ 19 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...