Слияние без переписывания одной таблицы - PullRequest
0 голосов
/ 08 января 2019

Мне интересно кое-что, что мне не кажется эффективным.

У меня есть 2 таблицы, одна очень большая таблица DATA (миллионы строк и сотни столбцов), с идентификатором в качестве первичного ключа.

Затем у меня есть другая таблица, NEW_COL, с переменными строками (от 1 до миллионов), но всегда с двумя столбцами: id и new_col_name.

Я хочу обновить первую таблицу, добавив в нее new_data.

Конечно, я знаю, как это сделать с помощью proc sql / left join или шага данных / merge.

Тем не менее, на мой взгляд, неэффективно, насколько я понимаю, со временем выполнения (что может быть неправильно), эти 2 способа полностью переписать огромную таблицу, даже когда NEW_DATA составляет всего 1 строку (почти 1 мин).

Я попытался выполнить 2 sql, с помощью alter table add column затем обновить, но это слишком медленно, так как обновление с объединением не кажется эффективным.

Итак, есть ли эффективный способ "добавить столбец" в существующую таблицу, БЕЗ переписывания этой огромной таблицы?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 08 января 2019

@ Ответ Ричарда идеален. Если вы добавляете столбцы на регулярной основе, значит, есть проблема с вашим дизайном. Вам либо нужно предоставить более подробную информацию о том, что вы делаете, и кто-то может предложить вам.

Я бы попробовал hash join. Вы можете найти код для простого хеш-соединения. Это эффективный способ объединения, потому что в вашем случае у вас есть одна большая таблица и одна маленькая таблица, если она умещается в памяти, это намного лучше, чем левое соединение. Я использовал различные объединения, и время выполнения запроса было значительно меньше (порядка 10)

При изменении подхода к таблице вы переписываете таблицу, и это также вызывает блокировку вашей таблицы, и никто не может использовать таблицу.

Это объединение следует выполнять, когда рабочая нагрузка меньше, а это означает, что в нерабочее время вам может потребоваться запланировать работу на ночь, когда доступно больше ресурсов SAS

0 голосов
/ 09 января 2019

Спасибо за ваши ответы, ребята.

Чтобы добавить информацию, у меня нет никаких ограничений относительно блокировки таблиц, балансировки нагрузки или чего-либо еще, так как я использую скрипт "projet tool".

На этапе подготовки данных «Генератор данных начальной точки» цель состоит в том, чтобы пересчитать уже существующие данные или добавить новые (реже, но все же довольно регулярно). Таким образом, я просто не хочу «терять» время на ожидание перезаписи всей таблицы, в то время как мне нужно обновить только одни данные для определенных строк.

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

Но, похоже, это обязательный шаг, поэтому ничего не поделаешь.

Слишком плохо.

0 голосов
/ 08 января 2019

Наборы данных SAS являются хранилищами строк, а не столбцовыми хранилищами, как таблицы в других базах данных. Таким образом, добавление строк намного проще и эффективнее, чем добавление столбцов. Представление с присоединенным ключом можно рассматривать как наиболее «эффективный» способ добавления столбца в прямоугольник данных.

Если вы добавляете столбцы так часто, что проблема занимает 1 минута, вам может потребоваться обновить оборудование с более быстрыми дисками, менее напряженной операционной средой или большим объемом памяти и SASFILE, если новые столбцы часто еще временны природа.

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