이벤트에 참여해서 Altibase HDB 완벽가이드 책을 받았는데(2012/01/26)

이벤트 기한은 2012/01/27까지 란다....헐~~ 오늘 책을 받았는데

회사일도 해야되고 어쩌나.....~~~ㅎㅎ

시간도 짧고 해서 기능들을 많이는 테스트 해보지 못했습니다.

잛은시간에 디비의 성능을 간단히 테스트 해보고자

다른 디비들과 백만건 정도 되는 데이터에 단순 SELECT 쿼리만 날려 보았습니다.

의외로 국산디비 성능이 다른 외산 디비에 비해 괜찮은 속도를 낸것같아..~~

앞으로 개발사에서 공격적인 마케팅과 서비스 지원이 이루어 진다면

충분이 시장에서 경쟁력이 있지 않을까라는 개인적인 생각을 해봅니다.


단순 SELECT 쿼리만 테스트 했고 테스트한 모든 디비는 같은 O/S, H/W에

테스트 해보았고, 모든 설치환경은 디폴트이고 따로 튜닝은 하지 않았습니다.
(MySQL은 속도가 안나와서 my.cnf점 수정함).
(elapsed time은 따로 기록하지 않았습니다. 간단한 리뷰를 쓰기위해  결과만 확인했으니 필요하다면 직접 해보시길..)

## H/W
CPU : i7-950/3.06Ghz/Quad Core
MEM : DDR3 SDRAM 2Gb*6(12Gb)
HDD : SATA3(7200rpm/64M)


## O/S
CentOS 5.6 64bit(Linux XXXX 2.6.18-238.12.1.el5xen #1 SMP Tue May 31 14:02:29 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux)


의외인것은 Altibase, CUBRID 반응속도가 다른 DB에 비해 상당히 빨랐음
그룹처리   : ORACLE(상용), CUBRID(오픈, 국산), Altibase(국산), PostgreSQL(오픈) 속도가 MySQL보다 빨랐음(1~2초 내외)
페이징처리 : ORACLE(상용), Altibase(국산), CUBRID(오픈, 국산) 상대적으로 빨랐음
             PostgreSQL, MySQL(MariaDB ??)은 상댁적으로 느렸음

FirebirdSQL(오픈, 구 InterBase) 시간이 없어 테스트 못함 ㅎㅎㅎ

일반 개인 및 공개 사이트 개발은 MySQL(MariaDB ??) 보단 CUBRID

상용 사이트 Oracle 디비를 마이그레이션 하거나 국산 디비를 적용해야되는 정부기관에는 Altibase

Altibase의 장점은 Oracle의 쿼리와 비슷하여 마이그레이션 하는데 다른 디비에
비하여 괜찮은 장점인것 같습니다.

Altibase를 좀더 사용해바야 알겠지만 단순 설치와 쿼리/인덱스/힌트/테이블스페이스등 구문이나 실행방법이
오라클 클론인것 같습니다.
PostgreSQL의 상용버전인 http://www.enterprisedb.com/ (Oracle 구문 동일 또는 유사함)와도 비슷한것 같기도하고
아무튼 이점 넘 마음에 듭니다.ㅎㅎ

Altibase(페이징속도 빠름) = CUBRID(그룹핑 속도 빠름) >= ORACLE > MySQL(MyISAM) >= PostgreSQL >= MySQL(InnoDB)

리뷰가 넘 허접하네...ㅎㅎ

 

Altibase 설치(다른 디비는 시간되면~~~올리도록 하겠습니다. 시간이 될라나..ㅋㅋ)
( http://atc.altibase.com/download/install_guide.jsp  참조)

http://atc.altibase.com/
해당 OS에 설치할 제품을 다운로드

gcc 버전확인
#gcc -v
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --disable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=x86_64-redhat-linux
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)
 
해당 gcc버전을 확인하고 버전에 맞는 패키지를 다운받는다.
설치용 altibase-XEON_LINUX_redhat_Enterprise_release5-64bit-5.3.3.12-release-GCC4.1.2.tgz
패치용 altibase-server-5.5.1.2-LINUX-X86-64bit-patch_0_0_2_5.run

계정생성
#useradd -G dba -g dba altibase

계정변경
#su - altibase

환경변수 설정(추가함, 패치 적용하고 삭제함)
$vi .bash_profile
ALTIBASE_HOME=$HOME/altibase_home; export ALTIBASE_HOME
PATH=$ALTIBASE_HOME/bin:$PATH ;export PATH
LD_LIBRARY_PATH=$ALTIBASE_HOME/lib:$LD_LIBRARY_PATH ;export LD_LIBRARY_PATH

패키지 압축풀기
$unzip altibase-XEON_LINUX_redhat_Enterprise_release5-64bit-5.3.3.12-release-GCC4.1.2.tgz

패키지 설치(디폴트 적용)
$./altibase_install.sh

license적용(복사함, http://atc.altibase.com/download/license_guide.jsp 신청후 적용)
$ALTIBASE_HOME/conf/license

패치파일 적용(디폴트 적용)
$chmod 755 altibase-server-5.5.1.2-LINUX-X86-64bit-patch_0_0_2_5.run
$./altibase-server-5.5.1.2-LINUX-X86-64bit-patch_0_0_2_5.run

환경변수 설정
$vi .bash_profile
삭제함 ALTIBASE_HOME=$HOME/altibase_home; export ALTIBASE_HOME
삭제함 PATH=$ALTIBASE_HOME/bin:$PATH ;export PATH
삭제함 LD_LIBRARY_PATH=$ALTIBASE_HOME/lib:$LD_LIBRARY_PATH ;export LD_LIBRARY_PATH

패치적용하고 추가된부분
. /home/altibase/altibase_home/conf/altibase_user.env

환경파일 적용
$source /home/altibase/.bash_profile

서버 시작(종료:$server stop)
$server start

시스템 계정 로그인
$isql -u sys -p manager -sysdba


테스트용 테이블스페이스 생성
iSQL(sysdba)>
    CREATE TABLESPACE "TS_TEST"
    DATAFILE '/home/altibase/altibase_home/dbs/ts_test.dbf'
    SIZE 100M
    AUTOEXTEND ON NEXT 100M
    MAXSIZE UNLIMITED;
   
iSQL(sysdba)>
    CREATE MEMORY TABLESPACE "TS_TEST_MEM"
    SIZE 131072K
    AUTOEXTEND ON NEXT 131072K
    MAXSIZE UNLIMITED
    CHECKPOINT PATH '/home/altibase/altibase_home/dbs'
    SPLIT EACH 1048576K;


테스트용 계정 생성
iSQL(sysdba)>
    CREATE USER test IDENTIFIED BY test
    TEMPORARY TABLESPACE "SYS_TBS_DISK_TEMP"
    DEFAULT TABLESPACE "TS_TEST"
    ACCESS "TS_TEST_MEM" ON;
   

데이터 건수 : 1,118,003
#################################### Altibase 5.6.1 ####################################
-- Altibase
-- @/path/USE_DETAIL.SQL;
-- $isql -u username -p passwd -f /path/USE_DETAIL.SQL
CREATE TABLE USE_DETAIL
(
     ud_seq             NUMBER(20,0)                NOT NULL
    ,rc_seq             VARCHAR2(10)
    ,ma_seq             VARCHAR2(20)
    ,fd_seq             NUMBER(20,0)
    ,ui_id              VARCHAR2(20)
    ,tm_seq             VARCHAR2(10)                NOT NULL
    ,ud_type            CHAR(1)         DEFAULT 'G' NOT NULL
    ,ud_weight          NUMBER(10,3)
    ,ud_usedate         VARCHAR2(20)    DEFAULT ''  NOT NULL
    ,ud_dayofweek       NUMBER(2,0)
    ,ud_cdate           VARCHAR2(20)
    ,ud_useunixtime     NUMBER(15,0)
    ,CONSTRAINT PK_USE_DETAIL PRIMARY KEY(ud_seq)
);

CREATE UNIQUE INDEX PK_USE_DETAIL ON USE_DETAIL(ud_seq);
CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);


접    속 : isql -u username -p passwd
실행시간 : iSQL> set timing on;
종    료 : iSQL> exit;

그룹핑 테스트 SQL :
       
        SELECT  X1.ud_seq, X1.ma_seq, X1.tm_seq
        FROM    USE_DETAIL X1,
        (
            SELECT  MAX(ud_seq) AS ud_seq, ma_seq, tm_seq
            FROM    USE_DETAIL X
            WHERE   ud_usedate BETWEEN '2011-07-01' AND '2011-08-01'
            AND     tm_seq  IN('00101','00102','00103','00104','00105','00106','00107','00108')
            AND     ud_type = 'G'
            GROUP   BY ma_seq, tm_seq
        ) X2
        WHERE X1.ud_seq = X2.ud_seq;
       
페이징 테스트 SQL :
       
        SELECT  *
        FROM
        (
            SELECT  ROWNUM rnum, X1.*
            FROM
            (
                SELECT   /*+ INDEX_DESC(X pk_use_detail) */ ud_seq, ma_seq, tm_seq, ud_usedate
                FROM    USE_DETAIL X
                WHERE   ud_type    = 'G'
            ) X1
            WHERE ROWNUM  <= 900051
        )
        WHERE   rnum BETWEEN 900000 AND 900050;
또는
        SELECT * FROM use_detail LIMIT 900000, 50;


인덱스 생성방벙 :
    DROP INDEX IDX_01;
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);
    OR
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate DESC, tm_seq, ud_type);
   
   
  
데이터 건수 : 1,118,003
#################################### MySQL 5.1.4 ###################################
-- MySQL(MariaDB ??)
-- mysql>\. /path/USE_DETAIL.SQL;
-- #>mysql -uusername -p dbname < /path/USE_DETAIL.SQL
CREATE TABLE USE_DETAIL
(
     ud_seq             BIGINT(20)                  NOT NULL
    ,rc_seq             VARCHAR(10)
    ,ma_seq             VARCHAR(20)
    ,fd_seq             BIGINT(20)
    ,ui_id              VARCHAR(20)
    ,tm_seq             VARCHAR(10)                 NOT NULL
    ,ud_type            CHAR(1)                     NOT NULL DEFAULT 'G'
    ,ud_weight          DOUBLE(10,3)
    ,ud_usedate         VARCHAR(20)                 NOT NULL DEFAULT ''
    ,ud_dayofweek       TINYINT(2)
    ,ud_cdate           VARCHAR(20)
    ,ud_useunixtime     INT(15)
    ,PRIMARY KEY(ud_seq)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE UNIQUE INDEX PK_USE_DETAILON USE_DETAIL(ud_seq);
CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);


접속 : mysql -uusername -ppasswd
디비 : mysql> use dbname;
종료 : mysql> exit; or \q

그룹핑 테스트 SQL :

        SELECT  X1.ud_seq, X1.ma_seq, X1.tm_seq
        FROM    USE_DETAIL X1,
        (
            SELECT  MAX(ud_seq) AS ud_seq, ma_seq, tm_seq
            FROM    USE_DETAIL X USE INDEX FOR GROUP BY(IDX_01)
            WHERE   ud_usedate BETWEEN '2011-07-01' AND '2011-08-01'
            AND     tm_seq  IN('00101','00102','00103','00104','00105','00106','00107','00108')
            AND     ud_type = 'G'
            GROUP   BY ma_seq, tm_seq
        ) X2
        WHERE X1.ud_seq = X2.ud_seq;

페이징 테스트 SQL :

        SELECT  ud_seq, ma_seq, tm_seq, ud_usedate
        FROM    USE_DETAIL X FORCE INDEX(IDX_01)
        WHERE   ud_type = 'G'
        ORDER   BY ud_seq DESC
        LIMIT   900000, 50;

인덱스 생성방벙 : 쿼리문에 흰트사용함, my.cnf도 버퍼용량 증가시킴
    ALTER TABLE USE_DETAIL DROP INDEX IDX_01;
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);

기타 : MyISAM, InnoDB Engine 둘다 테스트함
 


데이터 건수 : 1,118,003
#################################### ORACLE 10g ####################################
-- ORACLE
-- SQL>@/path/USE_DETAIL.SQL;
-- $sqlplus username/passwd @/path/USE_DETAIL.SQL
CREATE TABLE USE_DETAIL
(
     ud_seq             NUMBER(20,0)                NOT NULL
    ,rc_seq             VARCHAR2(10)
    ,ma_seq             VARCHAR2(20)
    ,fd_seq             NUMBER(20,0)
    ,ui_id              VARCHAR2(20)
    ,tm_seq             VARCHAR2(10)                NOT NULL
    ,ud_type            CHAR(1)         DEFAULT 'G' NOT NULL
    ,ud_weight          NUMBER(10,3)
    ,ud_usedate         VARCHAR2(20)    DEFAULT ''  NOT NULL
    ,ud_dayofweek       NUMBER(2,0)
    ,ud_cdate           VARCHAR2(20)
    ,ud_useunixtime     NUMBER(15,0)
    ,CONSTRAINT PK_USE_DETAIL PRIMARY KEY(ud_seq)
);

CREATE UNIQUE INDEX PK_USE_DETAIL ON USE_DETAIL(ud_seq);
CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);

접    속 : sqlplus username/passwd
실행시간 : SQL> set timing on
종    료 : SQL> exit;

그룹핑 테스트 SQL :
       
        SELECT  X1.ud_seq, X1.ma_seq, X1.tm_seq
        FROM    USE_DETAIL X1,
        (
            SELECT  MAX(ud_seq) AS ud_seq, ma_seq, tm_seq
            FROM    USE_DETAIL X
            WHERE   ud_usedate BETWEEN '2011-07-01' AND '2011-08-01'
            AND     tm_seq  IN('00101','00102','00103','00104','00105','00106','00107','00108')
            AND     ud_type = 'G'
            GROUP   BY ma_seq, tm_seq
        ) X2
        WHERE X1.ud_seq = X2.ud_seq;
       
페이징 테스트 SQL :
       
        SELECT  *
        FROM
        (
            SELECT  ROWNUM rnum, X1.*
            FROM
            (
                SELECT   /*+ INDEX_DESC(X pk_use_detail) */ ud_seq, ma_seq, tm_seq, ud_usedate
                FROM    USE_DETAIL X
                WHERE   ud_type    = 'G'
            ) X1
            WHERE ROWNUM  <= 900051
        )
        WHERE   rnum BETWEEN 900000 AND 900050;

인덱스 생성방벙 :
    DROP INDEX IDX_01;
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);
    OR
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate DESC, tm_seq, ud_type);
   

데이터 건수 : 1,118,003
################################# CUBRID 2008 R4.0##################################
-- CUBRID
-- csql>;REA /path/USE_DETAIL.SQL
-- csql>;RU
-- #csql demodb -i /path/USE_DETAIL.SQL
CREATE TABLE USE_DETAIL
(
     ud_seq             INTEGER                     NOT NULL
    ,rc_seq             VARCHAR(10)
    ,ma_seq             VARCHAR(20)
    ,fd_seq             INTEGER
    ,ui_id              VARCHAR(20)
    ,tm_seq             VARCHAR(10)                 NOT NULL
    ,ud_type            CHAR(1)         DEFAULT 'G' NOT NULL
    ,ud_weight          NUMERIC(10,3)
    ,ud_usedate         VARCHAR(20)     DEFAULT ''  NOT NULL
    ,ud_dayofweek       SHORT
    ,ud_cdate           VARCHAR(20)
    ,ud_useunixtime     INTEGER
    ,CONSTRAINT PK_USE_DETAIL PRIMARY KEY(ud_seq)
);

CREATE UNIQUE INDEX PK_USE_DETAIL ON USE_DETAIL(ud_seq);
CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);


접    속 : csql -C demodb
실행시간 : csql> ;time on 
종    료 : csql> ;ex

그룹핑 테스트 SQL :

        SELECT  X1.ud_seq, X1.ma_seq, X1.tm_seq
        FROM    USE_DETAIL X1,
        (
            SELECT  MAX(ud_seq) AS ud_seq, ma_seq, tm_seq
            FROM    USE_DETAIL X
            WHERE   ud_usedate BETWEEN '2011-07-01' AND '2011-08-01'
            AND     tm_seq  IN('00101','00102','00103','00104','00105','00106','00107','00108')
            AND     ud_type = 'G'
            GROUP   BY ma_seq, tm_seq
        ) X2
        WHERE X1.ud_seq = X2.ud_seq;

페이징 테스트 SQL :

        SELECT  ud_seq, ma_seq, tm_seq, ud_usedate
        FROM    USE_DETAIL
        WHERE   ud_type = 'G'
        ORDER   BY ud_seq DESC FOR ORDERBY_NUM() BETWEEN 900000 AND 900050;
       
       
인덱스 생성방벙 :
    DROP INDEX IDX_01;
    OR
    DROP REVERSE INDEX IDX_01;
   
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);
    OR
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate DESC, tm_seq, ud_type);
    OR
    CREATE REVERSE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);
   

데이터 건수 : 1,118,003
################################# PostgreSQL 8.4.7 ##################################
-- PostgreSQL
-- demodb=# \i /path/USE_DETAIL.SQL;
-- $psql -U username dbname < /path/USE_DETAIL.SQL
CREATE TABLE USE_DETAIL
(
     ud_seq             INTEGER                     NOT NULL
    ,rc_seq             VARCHAR(10)
    ,ma_seq             VARCHAR(20)
    ,fd_seq             INTEGER
    ,ui_id              VARCHAR(20)
    ,tm_seq             VARCHAR(10)                 NOT NULL
    ,ud_type            CHAR(1)         DEFAULT 'G' NOT NULL
    ,ud_weight          NUMERIC(10,3)
    ,ud_usedate         VARCHAR(20)     DEFAULT ''  NOT NULL
    ,ud_dayofweek       SMALLINT
    ,ud_cdate           VARCHAR(20)
    ,ud_useunixtime     INTEGER
    ,CONSTRAINT PK_USE_DETAIL PRIMARY KEY(ud_seq)
);

CREATE UNIQUE INDEX PK_USE_DETAIL ON USE_DETAIL(ud_seq);
CREATE INDEX IDX_01 ON USE_DETAIL1(ud_usedate, tm_seq, ud_type);


접    속 : psql -U postgres demodb
실행시간 : demodb=# \timing on
종    료 : demodb=# \q

그룹핑 테스트 SQL :

        SELECT  X1.ud_seq, X1.ma_seq, X1.tm_seq
        FROM    USE_DETAIL X1,
        (
            SELECT  MAX(ud_seq) AS ud_seq, ma_seq, tm_seq
            FROM    USE_DETAIL X
            WHERE   ud_usedate BETWEEN '2011-07-01' AND '2011-08-01'
            AND     tm_seq  IN('00101','00102','00103','00104','00105','00106','00107','00108')
            AND     ud_type = 'G'
            GROUP   BY ma_seq, tm_seq
        ) X2
        WHERE X1.ud_seq = X2.ud_seq;


페이징 테스트 SQL 1 :

        SELECT  ud_seq, ma_seq, tm_seq, ud_usedate
        FROM    USE_DETAIL
        WHERE   ud_type = 'G'
        ORDER   BY ud_seq DESC
        LIMIT   50 OFFSET 900000;

페이징 테스트 SQL 2 :
        SELECT  *
        FROM
        (
            SELECT  ROW_NUMBER() OVER (ORDER BY ud_usedate DESC) rnum, ud_seq, ma_seq, tm_seq, ud_usedate
            FROM    USE_DETAIL
            WHERE   ud_type = 'G'
        ) X2
        WHERE rnum BETWEEN 900000 AND 900050;

인덱스 생성방벙 :
    DROP INDEX IDX_01;
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);
    OR
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate DESC, tm_seq, ud_type);
   

####테스트 자료####
USE_DETAIL.7z

블로그 이미지

유효하지않음

,