Отредактировано 21 октября
Фон
Необработанные наборы данных (изменяющиеся каждый день), хранящиеся на сервере на основе MS-SQL: Sourcelib.RAW
и файл excel LOCAL
(остался unchanged
).
Мне нужно обновить набор данных WANT
находится в Targerlib
. В настоящее время у меня есть коды SQL, выполняющие такую задачу за 2-3 минуты. Но я хочу знать, может ли SAS делать то же самое, при этом время обработки не сильно увеличится.
work.IMP
составляет около 6 миллионов записей и около 50 байтов на запись.- Идеальный метод должен быть очень эффективным, потому что со временем размер необработанных наборов данных на сервере будет невероятно огромным.
- Целевой файл
CANNOT
можно создать за один раз, а затем добавлять в него новые данные каждый день. Потому что возможны (даже очень маловероятные) изменения в предыдущих данных.
Согласно @Joe, я должен позволить просто обновить целевой файл, используя proc compare
или update
в data step
. Вот связанный вопрос, который я разместил Как использовать proc для сравнения набора данных а>
- На сервере еще больше 10 Гб свободного места, этого вполне достаточно. Доступной памяти на моем компьютере около 3,5 ГБ (не уверен, что это имеет значение)
- Из-за архитектуры сервера это очень эффективно делать в MS-SQL. Но я ДЕЙСТВИТЕЛЬНО хочу знать, может ли SAS справиться с этим (когда сервер не так
"compatible"
)
Процесс
- Сначала я импортирую данные из файла Excel, а затем
subset&tranpose
, чтобы они былиwork.IMP
. По некоторым причинам этот файл может быть создан таким образом только каждый день. ОнCANNOT
хранится на сервере. - Затем выполните внешнее соединение для
work.IMP
и одного необработанного набора данныхSourcelib.RAW1
, чтобы получитьwork.HAVE1
. Обратите внимание, чтоwork.IMP
отсортировано, аSourcelib.RAW1
не отсортировано. Внешнее соединение предназначено только для (с некоторыми критериями) определения каждой записи данных.
i.e. case when a.COL1 is '' then b.COL1 else a.COL1 end as COL1
Вы можете считать этот процесс корректировкой Sourcelib.RAW1
с помощью work.IMP
.
PS1: @sparc_spread предлагает выполнить процедуру импорта напрямую на сервер. Но пользы от этого не будет больше, чем в LOCAL
. И hash object
тут тоже не поможет.
- Затем я подустанавливаю другие необработанные наборы данных с
Sourcelib.RAW2
наwork.temp
, а затемsort
наwork.HAVE2
. (Данные вSourcelib.RAW2
в основном не в порядке.) - Я объединяю
work.HAVE1
,work.HAVE2
, используяproc append
(потому что обе таблицы огромны), чтобы получитьwork.HAVE
PS2: Сортировка в step3
предназначена для того, чтобы избежать сортировки в конце step4
. На самом деле данные Targerlib.WANT
не обязательно должны быть в порядке. Но лучше так.
- В самом конце копирую
work.HAVE
на серверTargetlib.HAVE
.
Я сделал большую часть работы в WORK
, что заняло у меня всего несколько минут. Но у step5
у меня ушло бы полчаса на то, чтобы закончить копию.
Согласно @Joe, это может быть связано в основном с чем-то, связанным с сетевым транзитом. I.E
минимизировать сетевой транзит
Вопрос
Есть ли способ улучшить step5
? Или любая модификация всего процесса улучшит производительность?
work.IMP
, затем разделяете его на два набора данных, а затем повторно объединяете их в один. Если есть какой-то способ избежать этого, это было бы здорово - не могли бы вы рассказать мне больше о манипуляциях, которые вы делаете на шаге 2 B) Вы работаете в Windows или Linux? Какова аппаратная ситуация с библиотеками (находятся ли они на отдельных дисках, являются ли эти диски своего рода RAID-массивом, какова установка вашей служебной библиотеки (UTILLOC) и т. д.)? - person sparc_spread   schedule 16.10.2014sourcelib.raw
иsourcelib.raw2
начинаются как текстовые файлы или как наборы данных SAS? Пожалуйста, также дайте мне знать о моих вопросах о диске, особенно еслиtargetlib
иwork
находятся на одном или разных дисках. - person sparc_spread   schedule 17.10.2014