본문 바로가기

TECH ZOOM

[SAP HANA 기획연재] 개발부터 성능튜닝까지 이렇게 끝낸다



SAP HANA 가이드

SAP HANA는 인메모리데이터베이스 이지만 기존의 RDBM처럼 SQL을 사용하여 개발이 가능하며 타 DBMS와 호환이 가능한 ANSI-SQL을 사용하여 SQL을 개발합니다.

DataWarehouse 용 DBMS로 사용할 경우에 신규 개발 시에도 SQL이 필요하지만 기존의 오라클이나 MS-SQL과 같은 RDBMS에서 SAP HANA로 전환할 경우에도 SAP HANA에 맞는 SQL을 알아야 개발이 가능합니다. 또한 SAP ERP 시스템이나 SAP CRM, SAP SCM과 같은 Exended ERP 제품에서도 NATIVE SQL을 사용하는 경우가 있기 때문에 SAP HANA를 도입하는 경우에 SAP HANA 에서 사용하는 ANSI-SQL에 대한 지식은 필수적으로 필요합니다.

이 블로그에서는 SQL 뿐만이 아니라 모델링 방법, PERFORMANCE 튜닝 등의 개발 방법에 대해서도 순차적으로 연재할 예정입니다.


SAP HANA에서 자주 사용하는 데이터 타입은 아래와 같습니다.


분류

 데이터 타입

 Datetime types

 DATE, TIME, SECONDDATE, TIMESTAMP

 Numeric types

 TINYNT, SMALLINT, INTEGER, BIGINT,SMALLDECIMAL, 

 DECIMAL, REAL, DOUBLE 

 Character string types

 VARCHAR, NVARCHAR



컬럼 테이블 생성시에는 아래와 같이 CREATE 시 COLUMN TABLE을 명시하고 ROW 테이블 생성시에는 CREATE ROW TABLE 로 명시하거나 ROW를 생략하면 ROW TABLE로 생성됩니다.




일반적인 SQL 사용은 이전의 타 DBMS에서 사용하던 방식과 동일하며 아래와 같은 WINDOW FUNCTION도 사용이 가능합니다.


RANK

RANK는 ORDER BY를 포함한 QUERY 문에서 특정 컬럼에 대한 순위를 구하는 함수입니다. expression 컬럼별로 그룹화가 되고 window_order_by_clause의 순서로 순위가 구해집니다.



DENSE_RANK

DENSE_RANK는 RANK 함수와 유사하나 동일한 순위를 하나의 건수로 취급합니다.



ROW_NUMBER()

RANK나 DENSE RANK 함수가 동일한 값에 대해서는 같은 순위를 부여하는데 반하여, ROW_NUMBER는 동일한 값이라도 고유한 순위를 부여합니다.



LEAD

Expressin 컬럼의 현재 row에서 offset만큼의 후의 row의 값을 가져옵니다.


LAG

Expressin 컬럼의 현재 row에서 offset만큼의 전의 row의 값을 가져옵니다.



WINDOW FUNCTION을 사용한 예시는 아래와 같습니다.



기존에 오라클에서 개발한 SQL을 SAP HANA에서 사용할 경우에는 SAP HANA에 맞게 SQL 변환을 해주어야 합니다. 변경을 해야 하는 사항은


1. 오라클 HINT 문 삭제
     - 오라클 HINT문은 SAP HANA에 맞지 않습니다.

2. NVL ▶ IFNULL 또는 COALESCE
     SELECT NVL(A.ID,0) FROM TAB A
   >SELECT IFNULL(A.ID,’TEST’) FROM TAB A(IFNULL은 NVL과 동일)
   >SELECT COALESCE(A.ID,A.TEXT,’TEST’) FROM TABLE A
     (COALESCE 는 INPUT 변수가 2개 이상 일 경우도 사용가능)

3. DECODE ▶ MAP 또는 CASE WHEN
     SELECT DECODE(A.ID,’TEST’,A.TEXT,’TEST2’)FROM TAB A
   >SELECT MAP(A.ID,’TEST’,A.TEXT,’TEST2’) FROM TAB A(MAP은 DECODE와 동일)
   >SELECT CASE WHEN A.ID = ‘TEST’ THEN A.TEXT ELSE ‘TEST2’ END FROM TABA

4. ROWNUM=1 ▶ TOP 1
     SELECT A.ID FROM TAB WHERE ROWNUM = 1
   >SELECT TOP 1 A.ID FROM TAB(HANA DB에서는 ROWNUM이 없으므로 이를 대체할 수 있게 TOP 또는
     ROW_NUMBER() 등으로 변환)

5. LEFT OUTER JOIN
     SELECT A.CODE, B.CODE FROM TAB A, TAB2 B WHERE A.CODE = B.CODE(+)
   >SELECT A.CODE, B.CODE FROM TAB A LEFT OUTER JOIN TAB2 B ON A.CODE = B.CODE

6. SYSDATE ▶ NOW(),, DUAL ▶ DUMMY
     SELECT SYSDATE FROM DUAL
   >SELECT NOW() FROM DUMMY

7. DEPLACE ▶ SUBSTR_BEFORE
     SELECT* FROM FWWIPHISTORY WHERE DEPLACE(ID, '.') = 'PM-5005-Q_SL'
   >SELECT * FROM FWWIPHISTORY WHERE SUBSTR_BEFORE(ID,'.') = 'PM-5005-Q_SL'

8. VARCHAR2 ▶ VARCHAR
     CREATE TABLE TAB (ID VARCHAR2(5) )
   >CREATE TABLE TAB (ID VARCHAR(5) )


이외에도 WITH문이나 CONNECT BY PRIOR 문과 같은 오라클에서만 사용 가능한 기능은 SAP HANA에 맞게 변환을 해주어야 합니다.