DM 데이터베이스 핵심 기능 및 활용 가이드

DM 데이터베이스 기본 사용법

이 문서는 DM(Damon) 데이터베이스의 주요 기능과 활용법에 대해 다룹니다. 데이터베이스 관리 및 개발 시 유용한 SQL 구문과 관리 팁을 제공합니다.

1. 데이터베이스 상태 확인

데이터베이스의 현재 상태를 확인하려면 다음 쿼리를 사용합니다. 결과의 STATUS$ 값이 4이면 데이터베이스가 OPEN 상태임을, 3이면 MOUNT 상태임을 나타냅니다.

SELECT STATUS$ FROM V$DATABASE;

2. 테이블에 새 컬럼 추가

기존 테이블에 새로운 컬럼을 추가할 때 사용하는 DDL(데이터 정의어) 구문입니다.

ALTER TABLE 테이블_이름 ADD 컬럼_이름 데이터_타입;

3. 테이블 컬럼의 데이터 타입 변경

테이블 컬럼의 데이터 타입을 변경할 때 사용합니다. 단, TEXT 타입과 같이 특정 데이터 타입은 이 명령으로 변경하기 어렵거나 제한이 있을 수 있습니다.

ALTER TABLE 테이블_이름 MODIFY 컬럼_이름 새_데이터_타입;

4. 테이블 컬럼 이름 변경

테이블의 컬럼 이름을 변경하는 구문입니다.

ALTER TABLE 테이블_이름 ALTER 컬럼_현재_이름 RENAME TO 컬럼_새_이름;

5. 데이터베이스 작업 스케줄링

DM 데이터베이스는 에이전트(Agent) 기능을 통해 정기적인 작업을 스케줄링할 수 있습니다. 예를 들어, 특정 데이터 업데이트나 백업 작업 등을 자동화할 수 있습니다.

  • UI 경로: 에이전트(Agent) -> 작업(Job)

6. NVL 함수: NULL 값 처리

NVL 함수는 표현식이 NULL일 경우 지정된 값으로 대체하는 데 사용됩니다. 이는 데이터 출력 시 NULL 값을 가독성 있는 다른 값으로 표시해야 할 때 유용합니다.

SELECT NVL(컬럼명, '대체_값') FROM 테이블_이름;

예시: NVL(SALARY, 0)SALARY가 NULL이면 0으로 대체합니다.

7. SQL 논리 연산자: EXISTS 및 NOT EXISTS

EXISTSNOT EXISTS는 서브쿼리의 결과 존재 여부에 따라 TRUE/FALSE를 반환하는 논리 연산자입니다.

  • EXISTS: 서브쿼리가 하나 이상의 행을 반환하면 TRUE
  • NOT EXISTS: 서브쿼리가 어떤 행도 반환하지 않으면 TRUE

다음은 LEFT JOINEXISTS를 활용한 복합 쿼리의 예시입니다.

SELECT 
    p.PERSON_ID,
    p.PERSON_NAME,
    t1.TECH_LEVEL_NAME
FROM 
    PERSONS p
LEFT JOIN 
    (
        SELECT 
            tl.LEVEL_NAME AS TECH_LEVEL_NAME,
            gr.PERSON_ID AS GR_PERSON_ID
        FROM 
            GRANT_HISTORY gr
        LEFT JOIN 
            TECH_LEVELS tl ON tl.LEVEL_CODE = gr.TECHNICAL_LEVEL_CODE
        WHERE 
            EXISTS (SELECT 1 FROM GRANT_HISTORY gh_inner WHERE gh_inner.PERSON_ID = gr.PERSON_ID AND gh_inner.IS_LATEST = 'Y')
            AND gr.IS_LATEST = 'Y'
    ) t1 ON t1.GR_PERSON_ID = p.PERSON_ID;

8. 여러 쿼리 결과 병합: UNION 및 UNION ALL

여러 SELECT 문의 결과를 단일 결과 집합으로 병합할 때 사용합니다.

  • UNION: 중복된 행을 제거하고 병합합니다.
  • UNION ALL: 중복된 행을 포함하여 모든 행을 병합합니다.
SELECT COLUMN_A FROM TABLE_X
UNION
SELECT COLUMN_A FROM TABLE_Y;

SELECT COLUMN_B FROM TABLE_X
UNION ALL
SELECT COLUMN_B FROM TABLE_Y;

9. 문자열 자르기: SUBSTRING_INDEX 함수

SUBSTRING_INDEX 함수는 특정 구분자를 기준으로 문자열을 자르는 데 사용됩니다. 세 번째 인자 n은 구분자가 나타나는 횟수를 의미하며, 양수일 경우 앞에서부터, 음수일 경우 뒤에서부터 계산하여 문자열을 반환합니다.

SELECT SUBSTRING_INDEX('www.example.com', '.', 1); -- 결과: 'www'
SELECT SUBSTRING_INDEX('www.example.com', '.', 2); -- 결과: 'www.example'
SELECT SUBSTRING_INDEX('www.example.com', '.', -1); -- 결과: 'com'
SELECT SUBSTRING_INDEX('www.example.com', '.', -2); -- 결과: 'example.com'

10. 데이터 타입 변환: TO_CHAR 함수

TO_CHAR 함수는 다양한 데이터 타입을 문자열 타입으로 명시적으로 변환할 때 사용됩니다. 특히 TEXT 타입의 컬럼을 다른 형식으로 출력하거나 특정 보고서에서 호환성을 맞출 때 유용합니다.

SELECT TO_CHAR(NEWS_ARTICLE.DESCRIPTION) AS ARTICLE_TEXT FROM NEWS_ARTICLE;

11. 테이블 데이터 빠르게 삭제: TRUNCATE TABLE

TRUNCATE TABLE 명령은 테이블의 모든 행을 빠르게 삭제하고 할당된 공간을 재설정합니다. 이 명령은 DELETE와 달리 개별 행 삭제를 기록하지 않아 롤백이 불가능하며, 매우 신중하게 사용해야 합니다. 삭제된 데이터는 복구하기 어렵습니다.

TRUNCATE TABLE MY_TABLE;

12. 데이터 병합: MERGE INTO (UPSERT)

MERGE INTO 문은 대상 테이블에 소스 테이블의 데이터를 병합합니다. ON 절의 조건에 따라 일치하는 행은 업데이트하고, 일치하지 않는 행은 삽입하는 'UPSERT' 기능을 수행합니다.

MERGE INTO TARGET_TABLE tt
USING SOURCE_TABLE st
ON (tt.ID = st.SOURCE_ID)
WHEN MATCHED THEN
    UPDATE SET tt.DATA_VALUE = st.NEW_DATA_VALUE, tt.UPDATE_DATE = SYSDATE
WHEN NOT MATCHED THEN
    INSERT (ID, DATA_VALUE, CREATE_DATE) VALUES (st.SOURCE_ID, st.NEW_DATA_VALUE, SYSDATE);

13. 조건부 값 변환: DECODE 함수

DECODE 함수는 주어진 표현식의 값에 따라 다른 값을 반환합니다. CASE 문과 유사하게 작동하며, 단순한 조건 변환에 유용합니다.

SELECT DECODE(STATUS_CODE, 1, '활성', 2, '비활성', '미지정') AS STATUS_DESC FROM ORDERS;

위 쿼리는 STATUS_CODE가 1이면 '활성', 2면 '비활성', 그 외에는 '미지정'을 반환합니다.

14. 뷰 생성 시 GROUP BY 표현식 오류 해결 (DM 힌트)

DM 데이터베이스에서 뷰를 생성할 때 GROUP BY 표현식 관련 오류가 발생하는 경우, 특정 힌트를 사용하여 옵티마이저의 동작을 조절할 수 있습니다.

CREATE VIEW MY_AGG_VIEW AS
SELECT /*+ GROUP_OPT_FLAG(1) */
    COLUMN_A, COUNT(COLUMN_B)
FROM 
    SOME_TABLE
GROUP BY 
    COLUMN_A;

15. Hash Join 버퍼 공간 부족 오류 해결

"out of global hash join space" 오류는 해시 조인 작업에 필요한 전역 버퍼 공간이 부족할 때 발생합니다. 이 문제를 해결하려면 HJ_BUF_GLOBAL_SIZE 파라미터 값을 늘려야 합니다.

현재 설정값 확인:

SELECT PARA_NAME, PARA_VALUE, PARA_TYPE FROM SYS."V$DM_INI" WHERE PARA_NAME = 'HJ_BUF_GLOBAL_SIZE';

파라미터 값 변경 (예시: 500에서 1000으로 증가):

ALTER SYSTEM SET 'HJ_BUF_GLOBAL_SIZE'=1000 BOTH;

BOTH 키워드는 현재 세션과 데이터베이스의 영구 설정 모두에 변경 사항을 적용합니다.

16. CASE WHEN 조건문 사용

CASE WHEN 문은 복잡한 조건에 따라 다른 값을 반환할 때 사용되는 표준 SQL 구문입니다.

SELECT 
    CASE 
        WHEN ORDER_DATE IS NOT NULL THEN TO_CHAR(ORDER_DATE, 'YYYY-MM-DD') 
        ELSE '날짜 미지정' 
    END AS FORMATTED_ORDER_DATE
FROM 
    SALES_ORDERS;

17. 데이터베이스 플래시백(Flashback) 기능 활용

DM 데이터베이스의 플래시백 기능을 사용하면 특정 시점으로 데이터를 되돌리거나 과거 시점의 데이터를 조회할 수 있습니다. 이는 실수로 데이터를 변경하거나 삭제했을 때 유용합니다.

플래시백 활성화 여부 확인:

SELECT PARA_NAME, PARA_VALUE, PARA_TYPE FROM V$DM_INI WHERE PARA_NAME LIKE '%FLASHBACK%';

플래시백 기능 활성화:

ALTER SYSTEM SET 'ENABLE_FLASHBACK'=1 BOTH;

UNDO 보존 시간 확인 (초 단위):

SELECT PARA_NAME, PARA_VALUE, PARA_TYPE FROM V$DM_INI WHERE PARA_NAME LIKE 'UNDO_RETENTION';

UNDO 보존 시간을 24시간(86400초)으로 설정:

ALTER SYSTEM SET 'UNDO_RETENTION'=86400 BOTH;

플래시백 기능 사용 예시:

현재 시간 확인:

SELECT SYSDATE();
-- 2024-03-01 10:30:00

테스트 데이터 삭제:

DELETE FROM MY_SCHEMA.EMPLOYEES WHERE EMPLOYEE_ID = 101;

삭제 전 특정 시점의 데이터 조회:

SELECT * FROM MY_SCHEMA.EMPLOYEES WHEN TIMESTAMP '2024-03-01 10:30:00';

삭제된 데이터를 특정 시점으로 복원 (삽입):

INSERT INTO MY_SCHEMA.EMPLOYEES SELECT * FROM MY_SCHEMA.EMPLOYEES WHEN TIMESTAMP '2024-03-01 10:30:00';

18. 인덱스 생성

데이터 조회 성능을 향상시키기 위해 테이블 컬럼에 인덱스를 생성합니다.

CREATE INDEX 인덱스_이름 ON 테이블_이름 (컬럼_이름);

19. 테이블 빠르게 복사

기존 테이블의 구조와 데이터를 그대로 복사하여 새로운 테이블을 생성할 때 사용합니다.

CREATE TABLE NEW_TABLE AS SELECT * FROM ORIGINAL_TABLE;

20. IF 함수와 뷰의 제약 사항

DM 데이터베이스에서 IF 함수(SQL 표준 함수가 아닌 일부 DB에서 제공하는 확장 함수)는 단일 쿼리로는 정상 작동하지만, 뷰 내에서 사용할 경우 의미 분석 오류가 발생할 수 있습니다. 이는 뷰가 컴파일되는 방식과 IF 함수의 특정 구현 방식 간의 호환성 문제 때문일 수 있습니다. 이러한 경우 CASE WHEN 문을 사용하는 것이 좋습니다.

21. 특정 뷰만 조회 가능한 사용자 계정 생성

데이터베이스 보안 강화를 위해 특정 뷰에만 접근 권한을 가진 사용자 계정을 생성할 수 있습니다.

새 사용자 생성:

CREATE USER limited_viewer IDENTIFIED BY 'secure_password';

뷰 전용 역할(Role) 생성 (선택 사항):

CREATE ROLE view_access_role;

역할에 특정 뷰에 대한 SELECT 권한 부여:

GRANT SELECT ON MY_SCHEMA.MY_VIEW TO view_access_role;

사용자에게 역할 부여:

GRANT view_access_role TO limited_viewer;

또는 역할 없이 사용자에게 직접 권한 부여:

GRANT SELECT ON MY_SCHEMA.MY_VIEW TO limited_viewer;

새 계정으로 로그인했을 때 SYSOBJECTS 등 다른 시스템 객체에 대한 권한이 없다는 메시지가 표시될 수 있지만, 명시적으로 권한을 부여한 뷰는 정상적으로 조회 가능합니다.

22. 고급 인덱스 생성 (DM 전용)

DM 데이터베이스에서는 인덱스 생성 시 스토리지 설정 등 추가적인 옵션을 지정할 수 있습니다.

CREATE INDEX "IDX_SALES_PRODUCT" ON "SALES"."PRODUCTS"("PRODUCT_CODE" ASC) STORAGE(ON "MAIN_TABLESPACE", CLUSTERBTR);

이 예시에서는 PRODUCT_CODE 컬럼에 대해 MAIN_TABLESPACE에 인덱스를 생성하며, CLUSTERBTR 유형을 사용하도록 지정합니다.

23. 테이블의 소유자(스키마) 조회

특정 테이블이 어떤 스키마에 속해 있는지 확인할 때 사용하는 쿼리입니다.

SELECT OWNER AS TABLE_SCHEMA
FROM ALL_TABLES
WHERE TABLE_NAME = 'TARGET_TABLE_NAME';

태그: DM Database SQL DDL DML Database Administration

8월 16일 16:35에 게시됨