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
EXISTS 및 NOT EXISTS는 서브쿼리의 결과 존재 여부에 따라 TRUE/FALSE를 반환하는 논리 연산자입니다.
EXISTS: 서브쿼리가 하나 이상의 행을 반환하면 TRUENOT EXISTS: 서브쿼리가 어떤 행도 반환하지 않으면 TRUE
다음은 LEFT JOIN과 EXISTS를 활용한 복합 쿼리의 예시입니다.
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';