'sql'에 해당되는 글 2건

  1. 2007.05.07 SyBase IQ
  2. 2007.04.27 Datastep과 SQL 비교
04.IT Knowledge/RDBMS2007. 5. 7. 15:15
 SyBase IQ(이하 IQ)에 대한 짧은 소감.

 IQ는 써본 사람들은 알겠지만, 컬럼 기반의 DB이다.
 IQ는 DB로서 안정성은 다소 떨어지는 것처럼 보이지만, 이 컬럼 기반이라는 것이 어떤
장점을 지니고 있는지 짧게 기술해 보겠다.

 1. Group by 가 살인적으로 빠르다.
  -- 물론 Index가 없으면 빠르지 않겠지만(실제로 상당히 느렸다.), IQ에서 권장하는
    Index를 설정한 경우, Group by 함수(count/sum/min/max 등)의 수행속도는 ....정말
    타DB랑 비교가 안될 정도로 빠르다. ^^/b

 2. Join보다는 update방식의 SQL 수행
  -- 예를 들어 아래와 같은 SQL이 있다고 하자.
      아래의 예는 TABLE2에 있는 고객번호에 해당하는 ROW만 TABLE1에서 COL1기준
    으로 건수를 보는 것이다.
 ********************************  예 1 ******************************************
   SELECT COL2, COUNT(*)
     FROM TABLE1 A
    WHERE EXISTS (SELECT 1
                    FROM TABLE2 B
                   WHERE A.COL1 = B.COL1)
    GROUP BY COL2;
 ******************************************************************************************
      음...위와 같은 SQL을 IQ에서 실행하면, 건수에 따라 다르겠지만 식사를 하고, 차를
     한잔하고 자리에 오면 혹시 수행을 마쳤을 지도 모른다....ㅡ.ㅡ;;;
      위와 같은 SQL을 아래처럼 수행해 보자.
 ********************************  예 2 ********************************************
   SELECT COL1
        , COL2
        , 0    AS FLAG
     INTO #ZZZ
     FROM TABLE1;

   UPDATE #ZZZ   A
      SET A.FLAG = 1
     FROM TABLE2  B
    WHERE A.COL1 = B.COL1;

   SELECT COL2
        , COUNT(*)
     FROM #ZZZ
    WHERE FLAG = 1
    GROUP BY COL2;
 ******************************************************************************************
      위와 같이 수행하면, 예1보다 압도적으로 빠른 실행 시간을 확인할 수 있을 것이다.

 짧은 예시 그리고 간단한 예시이지만, IQ는 컬럼 베이스의 UPDATE방식의 SQL을
작성하므로, 내가 보기에는 초보자에게 적당하며, 구현된 고객사에서의 기능 자체가
DW/DM 쪽이므로 테이블의 구성이 비교적 단순하며, JOIN이 적게 일어나게끔 설계되어있다.
 그러므로, IQ에서 SQL을 구현할 때는
 1. 최종적으로 구할 모수집단을 구하고, 그 모수를 기반으로 컬럼값이 초기화 된 형태의
  TEMP 테이블을 만들고...
 ******************************************************************************************
   SELECT COL1
        , COL2
        , CONVERT(INT,0)              AS COL3
        , CONVERT(NUMERIC(18,0),0)    AS COL4
        , CONVERT(CHAR(400),'')       AS COL5
        , CONVERT(VARCHAR(400),'')    AS COL6
     INTO #ZZZ
     FROM TABLE1;
 ******************************************************************************************
 2. UPDATE에 의한 JOIN을 기반으로 작성해 나가면 된다.

 그럼...
 즐프 하시라~~
Posted by 아주 오래된 미래
04.IT Knowledge/SAS2007. 4. 27. 16:48
상황에 따라 다르겠지만....

/* 실행시간 : 5.12sec */
proc sql;
create table target as
select distinct
       tname
     , cname
     , sum(cnt) as scnt
 from code_freq_master
 group by tname, cname;

create table code_freq_master1 as
select a.yyyymmdd
     , a.tname                                    label="테이블명"
     , a.cname
     , a.vname
     , a.cnt
     , (a.cnt/b.scnt)*100   as cratio format=6.2  label="분포비율"
  from target as b
 inner join code_freq_master a
         on a.tname = b.tname
        and a.cname = b.cname;
quit;
/* 실행시간 : 0.26 + 3.25 + 0.03 + 2.50 = 6.04 */
proc means data=code_freq_master noprint;
       var cnt;
     class tname cname;
    output out=tmp1(where=(_type_=3) ) sum=sum;
run;
proc sort data=code_freq_master ; by tname cname; run;
proc sort data=tmp1 ; by tname cname; run;
data code_freq_master2;
merge code_freq_master(in=in1) tmp1(in=in2 drop=_type_ _freq_);
   by tname cname;
      percent=cnt/sum*100;
   if in1 and in2;
label percent='분포비율'
      sum='합계';
run;


********************************************
*
* Do your best!!
*
* Homepage : http://www.javarang.net
* Javarang Lee
*
********************************************

Posted by 아주 오래된 미래