SQL Passthrough в SAS - PullRequest
       21

SQL Passthrough в SAS

5 голосов
/ 11 марта 2009

Есть ли преимущества использования средства SQL Passthrough вместе с SAS?

Ответы [ 5 ]

6 голосов
/ 11 марта 2009

Хотя этот вопрос слишком широкий, я могу дать слишком широкий ответ.

Сквозной SQL в SAS позволяет напрямую связываться с базой данных. Это становится очень выгодным, когда вы используете специальные функции базы данных. Примером могут служить функции статистики Oracle. Вам не нужно беспокоиться о том, как SAS будет обрабатывать ваше кодирование или переводить ваш SQL.

Кроме того, для нас также было преимуществом то, что для сквозного SQL требуется очень мало обработки на стороне SAS. Если у вас очень занятая коробка SAS, вы можете отправить логику обработки непосредственно в базу данных. Это возможно без использования сквозного SQL, но у вас есть более высокий уровень контроля при его использовании.

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

5 голосов
/ 20 марта 2009

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 секунды.

2 голосов
/ 25 марта 2009

Использование passthrough имеет свои преимущества, но это зависит от того, чего вы пытаетесь достичь. Вообще, я использую стандартный proc sql без прохода при выполнении запросов. Однако недавно я использовал его для генерации некоторых сохраненных процедур.

proc sql;
    connect to mysql(user = 'xxxxx' pass = 'xxxxx' server = 'localhost');
        execute(set @id = &id.) by mysql;
        execute(select (@lit:=image_text) from quality.links_image_text where image_id = @id) by mysql;
        execute(set @lidx = locate('ninja',@lit)) by mysql;
        execute(set @lidx2 = locate(' ',@lit,@lidx)) by mysql;
        execute(set @lidxd = @lidx2 - @lidx) by mysql;
        execute(set @lf = substr(@lit,@lidx,@lidxd)) by mysql;

        create table asdf as
        select &id. as id, a as ws from connection to mysql
        (select @lf as a)
        ;
    disconnect from mysql;
quit;

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

2 голосов
/ 12 марта 2009

Если вы не используете pass-through, вам придется импортировать все записи (которые вам нужны для обработки) из базы данных в sas. Используя сквозную передачу, вы можете выполнить некоторую обработку на стороне базы данных и перенести только результирующие записи в sas. Разница (с точки зрения времени обработки и использования сети) может быть очень малая, в зависимости от того, что вы делаете.

0 голосов
/ 21 мая 2009

Проще говоря, сквозные операторы SQL дают вам больше контроля над тем, что отправляется в базу данных.

...