PROC SQL будет пытаться передать как можно больше логики в базу данных, но бывают случаи, когда это невозможно. Использование функций SAS, которые не имеют эквивалента в базе данных (или в ядре SAS / ACCESS для базы данных), предотвратит передачу всего запроса в базу данных. Когда запрос не полностью передается в базу данных, данные помещаются в SAS и обрабатываются там. Чем сложнее ваш SQL, тем больше вероятность, что он будет обработан в SAS. Вот случай, который имеет большее значение, чем вы можете себе представить.
libname db <database> path=dbserver user=... password=...;
proc sql;
create table db.new as
select * from db.largedata where flag=1;
quit;
Это фактически (по крайней мере, через SAS 9.1.3) перетянет все данные, которые соответствуют flag = 1, в SAS, а затем загрузит их обратно в базу данных. Это миллионы строк, которые действительно замедляются.
В этом случае явный проход будет намного быстрее.
proc sql;
connect dbase (server=dbserver user=... password=...);
execute (create table db.new as
select * from db.largedata where flag=1) as dbase;
disconnect dbase;
quit;
Недавно я сделал пример, используя Oracle и таблицу с 250 000 строк. Первый путь занял 20 секунд, а второй - 2 секунды.