04.IT Knowledge/RDBMS2008. 12. 18. 14:42

[SQL 작성 요령]
1. 중심축으로 삼을 테이블을 선정한다.
2. 건수를 기록한다.
3. 가로로 정보를 추가하는 경우 JOIN을 세로로 정보를 추가하는 경우는 UNION을 사용한다.
4. 건수를 조회하여 확인한다.

[[ 예제 테이블 ]]

T1 T2
C11 C12 C21 C22
A 1 E 11
B 2 F 12
C 3 G 13
D 4
E 5
F 6

INNER JOIN (건수의 손실을 주의할 것)
SQL>>
SELECT T1.C11, T1.C12, T2.C22
  FROM T1
 INNER JOIN T2
         ON T1.C11 = T2.C21
RESULT>>
C11 C12 C22
E 5 11
F 6 12

LEFT OUTER JOIN (의도치 않은 Null의 발생, 건수의 증가를 주의할 것)
SQL>>
SELECT T1.C11, T1.C12, T2.C22
  FROM T1
  LEFT OUTER JOIN T2
         ON T1.C11 = T2.C21
RESULT>>
C11 C12 C22
A 1 Null
B 2 Null
C 3 Null
D 4 Null
E 5 11
F 6 12

RIGHT OUTER JOIN (가급적 Left outer join으로 사용할 것을 고려한다.)
SQL>>
SELECT T1.C11, T1.C12, T2.C21, T2.C22
  FROM T1
  FULL OUTER JOIN T2
         ON T1.C11 = T2.C21
RESULT>>
C11 C12 C21 C22
A 1 Null Null
B 2 Null Null
C 3 Null Null
D 4 Null Null
E 5 E 11
F 6 F 12
Null Null G 13

UNION (중복이 제거된다. 정렬이 일어나므로 속도의 저하가 있을 수 있다.)
SQL>>
SELECT C11, C12
  FROM T1
UNION
SELECT C21, C22
  FROM T2
RESULT>>
C11 C12
A 1
B 2
C 3
D 4
E 5
F 6
G 13

UNION ALL
SQL>>
SELECT C11, C12
  FROM T1
UNION ALL
SELECT C21, C22
  FROM T2
RESULT>>
C11 C12
A 1
B 2
C 3
D 4
E 5
F 6
E 11
F 12
G 13

Posted by 아주 오래된 미래
04.IT Knowledge/RDBMS2008. 11. 28. 18:36
SELECT TS.STATUS
     , DATA.NAME
     , TS.CONTENTS
     , EXTENT_MANAGEMENT
     , DATA.MBYTES "SPACE(MB)"
     , FREE.FREE "FREE(MB)"
     , TRUNC((DATA.MBYTES-FREE.FREE)/DATA.MBYTES*100,2) "Used(%)"
  FROM (SELECT TABLESPACE_NAME             AS NAME
             , TRUNC(SUM(BYTES/1024/1024)) AS MBYTES
          FROM DBA_DATA_FILES
         GROUP BY TABLESPACE_NAME
       ) DATA
     , (SELECT FREE.TABLESPACE_NAME
             , TRUNC(SUM(FREE.BYTES)/1024/1024,1) AS FREE
          FROM DBA_FREE_SPACE FREE
         GROUP BY FREE.TABLESPACE_NAME
        ) FREE
     , DBA_TABLESPACES    TS
 WHERE DATA.NAME = FREE.TABLESPACE_NAME
   AND DATA.NAME = TS.TABLESPACE_NAME
;

SELECT TS.STATUS
     , DATA.FILE_NAME
     , DATA.NAME
     , DATA.MBYTES "SPACE(MB)", FREE.FREE "FREE(MB)"
     , TRUNC((DATA.MBYTES-FREE.FREE)/DATA.MBYTES*100,2) "Used(%)"
  FROM (SELECT TABLESPACE_NAME NAME
             , FILE_NAME
             , FILE_ID
             , TRUNC(BYTES/1024/1024) MBYTES
          FROM DBA_DATA_FILES
        ) DATA
     , (SELECT TABLESPACE_NAME
             , FILE_ID
             , TRUNC(BYTES/1024/1024,1) FREE
          FROM DBA_FREE_SPACE FREE
        ) FREE
     , DBA_TABLESPACES    TS
 WHERE DATA.NAME    = FREE.TABLESPACE_NAME
   AND DATA.NAME    = TS.TABLESPACE_NAME
   AND DATA.FILE_ID = FREE.FILE_ID
   AND DATA.NAME    NOT IN ('UNDOTBS1', 'SYSTEM')
;
Posted by 아주 오래된 미래
04.IT Knowledge/RDBMS2008. 10. 31. 20:15
CREATE OR REPLACE FUNCTION ISDATE8( P_DATE IN VARCHAR2, D_FORMAT IN VARCHAR2 DEFAULT 'YYYYMMDD', P_ERR IN VARCHAR2 DEFAULT '99991231' )
RETURN VARCHAR2
IS
BEGIN
    IF LENGTH(P_DATE) < 8 THEN
        RETURN P_ERR;
    ELSE
        RETURN TO_CHAR(TO_DATE(P_DATE,D_FORMAT),D_FORMAT);
    END IF;
    EXCEPTION
        WHEN OTHERS THEN BEGIN
            RETURN P_ERR;
    END;
END;
/

Posted by 아주 오래된 미래
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 아주 오래된 미래