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을 기반으로 작성해 나가면 된다.
그럼...
즐프 하시라~~
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을 기반으로 작성해 나가면 된다.
그럼...
즐프 하시라~~