문제

SAS와 함께 SQL 패스 스루 시설을 사용하면 이점이 있습니까?

도움이 되었습니까?

해결책

이 질문은 지나치게 광범위하지만 지나치게 광범위한 대답을 제공 할 수 있습니다.

SAS의 통과 SQL을 사용하면 데이터베이스와 직접 통신 할 수 있습니다. 데이터베이스 특정 기능을 사용할 때 매우 유리합니다. 예를 들어 Oracle의 통계 기능이 있습니다. SAS가 코딩을 처리하거나 SQL을 번역하는 방법에 대해 걱정할 필요가 없습니다.

또한 통과 통과 SQL은 SAS 측에서 처리가 거의 필요하지 않다는 이점도 우리에게 이익이되었습니다. 매우 바쁜 SAS 상자가있는 경우 처리 로직을 데이터베이스로 직접 보내도록 선택할 수 있습니다. 패스 스루 SQL을 사용하지 않고는 가능하지만 활용할 때 더 높은 수준의 제어 기능이 있습니다.

이것은 결코 철저한 혜택 목록이 아니며 단순히 통과 SQL을 사용하는 몇 가지 높은 수준의 특권입니다. 보다 구체적인 사용 사례가있는 경우 코딩 기술의 특정 차이점에 대해 논의 할 수 있습니다.

다른 팁

Proc SQL은 데이터베이스에 가능한 많은 논리를 시도하고 전달하지만, 할 수없는 다양한 시간이 있습니다. 데이터베이스 (또는 데이터베이스의 SAS/Access Engine)에서 동등하지 않은 SAS 기능을 사용하면 전체 쿼리를 데이터베이스로 전달하지 못합니다. 쿼리가 데이터베이스로 완전히 전달되지 않으면 데이터가 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을 통해) 플래그 = 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 초입니다.

패스 스루를 사용하지 않으면 데이터베이스에서 SAS로 모든 레코드 (처리에 필요한)를 가져와야합니다. 패스 스루를 사용하면 데이터베이스 측면에서 처리를 수행하고 결과 레코드 만 SAS로 가져올 수 있습니다. 차이 (처리 시간 및 네트워크 사용 측면에서)는 자신이하는 일에 따라 작은 것에서 큰 것까지 매우 가능합니다.

패스 스루를 사용하는 데는 이점이 있지만 달성하려는 내용에 따라 다릅니다. 일반적으로 쿼리를 할 때 패스 스루없이 표준 Proc SQL을 사용합니다. 그러나 최근에는 저장된 Procs를 생성하는 데 사용했습니다.

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;

분명히, 그것은 패스 스루 밖에서 할 수있는 일이 아닙니다 (적어도 내가 아는 것은 아닙니다). 그렇습니다 ... 그것은 모두 당신이 성취하려는 것이 무엇인지에 달려 있습니다.

간단히 말해서, SQL 통과 진술은 데이터베이스로 전송되는 내용을 더 많이 제어 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top