Эффективное чтение больших таблиц MSSQL из SAS - PullRequest
1 голос
/ 28 июня 2019

Я работаю с некоторыми довольно большими таблицами в SQL Server (более 47 000 МБ) и изучил способы более быстрого импорта данных в SAS.

Я начал со следующего кода, который занимает много времени:

  LIBNAME SQL ODBC DSN='SQL Server' user=EMTCED pw=HdPS1eMtc9 schema=dbo; 

  data ED_TAT;
  set sql.ED_TAT_Master;
  run;

Проведя небольшое исследование, я обнаружил, что опции (BULKLOAD = yes BL_METHOD = CLILOAD) должны обеспечиватьнекоторое облегчение;однако, добавляя это в мой код, я получаю следующую ошибку.

  LIBNAME SQL ODBC DSN='SQL Server' user=EMTCED pw=HdPS1eMtc9 schema=dbo; 

  data ED_TAT (BULKLOAD=yes BL_METHOD=CLILOAD);
  set sql.ED_TAT_Master;
  run;


  ERROR 22-7: Invalid option name BULKLOAD.

Есть что-то, чего мне не хватает или другой вариант, который будет работать лучше?Спасибо!

1 Ответ

1 голос
/ 29 июня 2019

BULKLOAD=yes для загрузки данных из SAS.Чтение данных в SAS не требует специальных флагов.

47 ГБ через два часа кажется медленным, но я не уверен, что вы найдете кого-то, кто готов помочь вам устранить неполадки на онлайн-форуме.Вы пытались найти узкое место?Достаточно ли у вас пропускной способности сети?Работает ли запрос в той же таблице в MSSQL быстрее?Видите ли вы, как процесс SAS максимально загружает процессор или ожидает ввода-вывода?

Если мы рассматриваем скорость передачи как заданную, вы можете попробовать уменьшить объем загружаемых данных:

  • отфильтруйте строки с помощью where как , предложенного @ Reeza
  • keep только для нужных вам столбцов
  • или используйте Пропуск SQLсредство для обработки данных без чтения их в SAS или предварительной обработки данных на SQL Server и дальнейшего уменьшения объема данных, которые необходимо загружать.

Вы можете увидеть плохую производительность, еслиу вас есть много столбцов varchar: символьные столбцы SAS имеют фиксированную длину, поэтому процесс SAS в конечном итоге будет записывать множество нулевых байтов, если вы не установите COMPRESS = yes в своем наборе выходных данных.Я не уверен, но это может повлиять и на сеть, так что вы можете попробовать использовать substring() в проходе SQL, хотя для ограничения объема данных, которые SAS должен будет обработать.

...